CN108829526A - 一种进程间通信方法、电子设备及可读存储介质 - Google Patents
一种进程间通信方法、电子设备及可读存储介质 Download PDFInfo
- Publication number
- CN108829526A CN108829526A CN201810434277.3A CN201810434277A CN108829526A CN 108829526 A CN108829526 A CN 108829526A CN 201810434277 A CN201810434277 A CN 201810434277A CN 108829526 A CN108829526 A CN 108829526A
- Authority
- CN
- China
- Prior art keywords
- overlapping
- function
- client
- memory space
- asynchronous
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/545—Interprogram communication where tasks reside in different layers, e.g. user- and kernel-space
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/34—Network arrangements or protocols for supporting network services or applications involving the movement of software or configuration parameters
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/541—Client-server
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer And Data Communications (AREA)
Abstract
本发明提供了一种进程间通信方法、电子设备及可读存储介质,用于提供一种利用Windows的命名管道实现一个服务器进程与多个客户端进程之间进行异步数据通信的方法。该方法包括:创建服务线程;调用accept函数,创建重叠IO和调用设置了预设安全访问属性的CreateNamedPipe函数创建异步的命名管道句柄,将命名管道句柄传入重叠IO的Pointer字段中,调用ConnectNamedPipe函数,异步等待来自客户端的异步任务,将重叠IO存放至与异步任务对应的存储空间中;通过服务线程循环查看第一存储空间、第二存储空间以及第三存储空间中的重叠IO,如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO。
Description
技术领域
本发明涉及电子技术领域,尤其涉及一种进程间通信方法、电子设备及可读存储介质。
背景技术
在Windows系统下,进行进程间通信时,可以采用命名管道NamedPipe的方式来实现。在采用命名管道实现进程间数据传输时,既可以采用异步的方式也可以采用同步的方式。如果采用同步方式,在发送或者接收大数据量的数据时,极有可能会引起上层应用程序的阻塞或者卡顿。而采用异步传输时,由于上层的应用不会等到将所有数据处理完成后才返回,所以利用命名管道进行异步传输时,会起到更好的效果。现有技术在使用命名管道时,大多采用的是一对一的方式,也就是单个进程与单个进程之间进行通信,并没有采用一个进程与多个进程之间进行通信的方式。并且,Windows系统上的命名管道是一种系统资源,设置有相关的访问权限。当服务器进程以管理员权限启动并使用默认的安全方式创建了一个命名管道后,如果客户端以非管理员权限打开服务器端创建的命名管道,那么客户端就会因为权限不够,从而连不上命名管道服务器,导致服务器与客户端间的通信连接异常。
发明内容
本发明实施例提供了一种进程间通信方法、电子设备及可读存储介质,用于提供一种利用Windows的命名管道实现一个服务器进程与多个客户端进程之间进行异步数据通信的方法,并通过创建最低安全访问级别的命名管道句柄,使得客户端均能访问该命名管道句柄与服务器进行通信。
第一方面,本发明提供了一种进程间通信方法,应用于服务器,包括:
创建服务线程,所述服务线程用于处理针对客户端的异步任务,所述异步任务包括处理客户端的连接请求、接收客户端发送的数据请求以及向客户端发送数据请求;
调用accept函数,通过所述accept函数调用设置了预设安全访问属性的CreateNamedPipe函数创建异步的命名管道句柄和通过所述accept函数创建重叠IO,将所述命名管道句柄传入所述重叠IO的Pointer字段中,调用ConnectNamedPipe函数,异步等待来自客户端的所述异步任务,将所述重叠IO存放至与所述异步任务对应的存储空间中,其中,所述命名管道句柄通过所述预设安全访问属性指定访问等级,所述命名管道句柄指定的访问等级使得所述服务器以管理员权限或非管理员权限创建所述命名管道句柄情况下,所述客户端均能访问所述命名管道句柄,所述服务器中设置有用于存储所述处理客户端的连接请求对应的重叠IO的第一存储空间、用于存储所述接收客户端发送的数据请求对应的重叠IO的第二存储空间以及用于存储所述向客户端发送数据请求对应的重叠IO的第三存储空间;
通过所述服务线程循环查看所述第一存储空间、所述第二存储空间以及所述第三存储空间中的重叠IO,如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO。
可选的,在所述调用accept函数之前,所述方法还包括:
初始化安全描述符;
将所述安全描述符的安全访问级别设置为最低等级;
创建安全属性描述结构,将安全访问级别设置为最低等级的所述安全描述符传入所述安全属性描述结构的属性字段中;
将创建的所述安全属性描述结构传入所述CreateNamedPipe函数的安全属性参数中,以使得所述CreateNamedPipe函数的安全属性设置为所述预设安全访问属性。
可选的,在所述如果查看到当前重叠IO处理完成之后,所述方法还包括:
将所述当前重叠IO从对应的存储空间中删除。
可选的,所述如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO,包括:
如果所述当前重叠IO为所述第一存储空间中的重叠IO,调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定有客户端连接到所述服务器;
调用onAccepted函数,在所述onAccepted函数中创建第一会话对象,调用所述第一会话对象的asyncReadSome函数,读取所述客户端发送的数据;
继续处理下一个存储空间的重叠IO。
可选的,所述如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO,包括:
如果所述当前重叠IO为所述第二存储空间中的重叠IO,调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定成功接收到来自客户端发送的数据;
通过所述当前重叠IO中Pointer字段获取所述当前重叠IO对应的第二会话对象;
调用所述第二会话对象的onReadComplete函数处理接收到的数据;
调用所述第二会话对象的asyncReadSome函数,把下一个读取的重叠IO放入到所述第二存储空间;
继续处理下一个存储空间的重叠IO。
可选的,所述如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO,包括:
如果所述当前重叠IO为所述第三存储空间中的重叠IO,定位与所述当前重叠IO对应的第三会话对象;
调用所述第三会话对象的asyncWriteSome函数异步的发送数据至客户端;
调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定成功的将数据发送至客户端;
继续处理下一个存储空间的重叠IO。
第二方面,本发明实施例提供一种电子设备,应用于服务器,包括:
创建单元,用于创建服务线程,所述服务线程用于处理针对客户端的异步任务,所述异步任务包括处理客户端的连接请求、接收客户端发送的数据请求以及向客户端发送数据请求;
调用单元,用于调用accept函数,通过所述accept函数调用设置了预设安全访问属性的CreateNamedPipe函数创建异步的命名管道句柄和通过所述accept函数创建重叠IO,将所述命名管道句柄传入所述重叠IO的Pointer字段中,调用ConnectNamedPipe函数,异步等待来自客户端的所述异步任务,将所述重叠IO存放至与所述异步任务对应的存储空间中,其中,所述命名管道句柄通过所述预设安全访问属性指定访问等级,所述命名管道句柄指定的访问等级使得所述服务器以管理员权限或非管理员权限创建所述命名管道句柄情况下,所述客户端均能访问所述命名管道句柄,所述服务器中设置有用于存储所述处理客户端的连接请求对应的重叠IO的第一存储空间、用于存储所述接收客户端发送的数据请求对应的重叠IO的第二存储空间以及用于存储所述向客户端发送数据请求对应的重叠IO的第三存储空间;
处理单元,用于通过所述服务线程循环查看所述第一存储空间、所述第二存储空间以及所述第三存储空间中的重叠IO,如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO。
可选的,所述电子设备还包括:
安全访问属性设置单元,用于初始化安全描述符,将所述安全描述符的安全访问级别设置为最低等级,创建安全属性描述结构,将安全访问级别设置为最低等级的所述安全描述符传入所述安全属性描述结构的属性字段中,将创建的所述安全属性描述结构传入所述CreateNamedPipe函数的安全属性参数中,以使得所述CreateNamedPipe函数的安全属性设置为所述预设安全访问属性。
可选的,所述电子设备还包括:
删除单元,用于在所述如果查看到当前重叠IO处理完成之后,将所述当前重叠IO从对应的存储空间中删除。
可选的,所述处理单元用于:
如果所述当前重叠IO为所述第一存储空间中的重叠IO,调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定有客户端连接到所述服务器;
调用onAccepted函数,在所述onAccepted函数中创建第一会话对象,调用所述第一会话对象的asyncReadSome函数,读取所述客户端发送的数据;
继续处理下一个存储空间的重叠IO。
可选的,所述处理单元用于:
如果所述当前重叠IO为所述第二存储空间中的重叠IO,调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定成功接收到来自客户端发送的数据;
通过所述当前重叠IO中Pointer字段获取所述当前重叠IO对应的第二会话对象;
调用所述第二会话对象的onReadComplete函数处理接收到的数据;
调用所述第二会话对象的asyncReadSome函数,把下一个读取的重叠IO放入到所述第二存储空间;
继续处理下一个存储空间的重叠IO。
可选的,所述处理单元用于:
如果所述当前重叠IO为所述第三存储空间中的重叠IO,定位与所述当前重叠IO对应的第三会话对象;
调用所述第三会话对象的asyncWriteSome函数异步的发送数据至客户端;
调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定成功的将数据发送至客户端;
继续处理下一个存储空间的重叠IO。
第三方面,本发明实施例提供一种电子设备,所述电子设备包括处理器,所述处理器用于执行存储器中存储的计算机程序时实现如前述第一方面实施例中所述的进程间通信方法的步骤。
第四方面,本发明实施例提供了一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如前述第一方面实施例中所述的进程间通信方法的步骤。
本申请实施例中的上述一个或多个技术方案,至少具有如下一种或多种技术效果:
在本发明实施例的技术方案中,创建服务进程,用于与多个客户端的进程通信,处理客户端的异步任务。进而,再调用accept函数创建异步任务对应的异步的命名管道句柄和重叠IO,将异步的命名管道句柄传入重叠IO的Pointer字段中,调用ConnectNamedPipe函数,异步等待来自客户端的所述异步任务,然后将重叠IO存放至所述异步任务对应的存储空间中,通过服务线程循环查看存储的重叠IO,如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO。进而,利用Windows的命名管道实现一个服务器进程与多个客户端进程之间进行异步数据通信。并且,在调用CreateNamedPipe函数创建命名管道句柄时,通过CreateNamedPipe函数的预设安全访问属性指定命名管道句柄的访问等级为最低访问等级,不管服务器以管理员或非管理员的权限创建该命名管道句柄,客户端均有访问该命名管道句柄的权限,确保客户端能与服务器成功连接。
附图说明
图1为本发明第一实施例中的一种进程间通信方法的流程图;
图2为本发明第二实施例中的电子设备的示意图;
图3为本发明第三实施例中电子设备的示意图。
具体实施方式
本发明实施例提供了一种进程间通信方法、电子设备及可读存储介质,用于提供一种利用Windows的命名管道实现一个服务器进程与多个客户端进程之间进行异步数据通信的方法。该方法包括:创建服务线程,所述服务线程用于处理针对客户端的异步任务,所述异步任务包括处理客户端的连接请求、接收客户端发送的数据请求以及向客户端发送数据请求;调用accept函数,通过所述accept函数调用设置了预设安全访问属性的CreateNamedPipe函数创建异步的命名管道句柄和通过所述accept函数创建重叠IO,将所述命名管道句柄传入所述重叠IO的Pointer字段中,调用ConnectNamedPipe函数,异步等待来自客户端的所述异步任务,将所述重叠IO存放至与所述异步任务对应的存储空间中,其中,所述命名管道句柄通过所述预设安全访问属性指定访问等级,所述命名管道句柄指定的访问等级使得所述服务器以管理员权限或非管理员权限创建所述命名管道句柄情况下,所述客户端均能访问所述命名管道句柄,所述服务器中设置有用于存储所述处理客户端的连接请求对应的重叠IO的第一存储空间、用于存储所述接收客户端发送的数据请求对应的重叠IO的第二存储空间以及用于存储所述向客户端发送数据请求对应的重叠IO的第三存储空间;通过所述服务线程循环查看所述第一存储空间、所述第二存储空间以及所述第三存储空间中的重叠IO,如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO。
下面通过附图以及具体实施例对本发明技术方案做详细的说明,应当理解本申请实施例以及实施例中的具体特征是对本申请技术方案的详细的说明,而不是对本申请技术方案的限定,在不冲突的情况下,本申请实施例以及实施例中的技术特征可以相互组合。
本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
实施例
请参考图1,本发明第一实施例提供一种进程间通信方法,应用于服务器,该进程间通信方法包括如下步骤:
S101:创建服务线程,所述服务线程用于处理针对客户端的异步任务,所述异步任务包括处理客户端的连接请求、接收客户端发送的数据请求以及向客户端发送数据请求;
S102:调用accept函数,通过所述accept函数调用设置了预设安全访问属性的CreateNamedPipe函数创建异步的命名管道句柄和通过所述accept函数创建重叠IO,将所述命名管道句柄传入所述重叠IO的Pointer字段中,调用ConnectNamedPipe函数,异步等待来自客户端的所述异步任务,将所述重叠IO存放至与所述异步任务对应的存储空间中,其中,所述命名管道句柄通过所述预设安全访问属性指定访问等级,所述命名管道句柄指定的访问等级使得所述服务器以管理员权限或非管理员权限创建所述命名管道句柄情况下,所述客户端均能访问所述命名管道句柄,所述服务器中设置有用于存储所述处理客户端的连接请求对应的重叠IO的第一存储空间、用于存储所述接收客户端发送的数据请求对应的重叠IO的第二存储空间以及用于存储所述向客户端发送数据请求对应的重叠IO的第三存储空间;
S103:通过所述服务线程循环查看所述第一存储空间、所述第二存储空间以及所述第三存储空间中的重叠IO,如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO。
其中,在所述如果查看到当前重叠IO处理完成之后,将所述当前重叠IO从对应的存储空间中删除。
具体的,本实施例中的方法主要应用于服务器端,在服务器端,服务器进程调用CreateNamedPipe函数根据一个指定的名称pipename来创建一个有名称的命名管道,然后调用ConnectNamedPipe来等待客户端的连接请求,这个函数既可以支持同步方式,又可以支持异步方式,若果服务器进程以同步方式调用ConnectNamedPipe函数,那么如果没有得到客户端的连接请求,那么会一直等到客户端的连接请求,所以此时会阻塞调用该函数的线程,当该函数返回时,客户端便与服务端建立了通信连接。如果服务端以异步的方式调用ConnectNamedPipe函数来处理客户端的连接请求,那么该函数会立即返回,不会阻塞调用该函数的线程。但是在以异步方式调用该函数时,需要指定一个结构类型为OVERLAPPED的重叠IO参数,传递给该ConnectNamedPipe函数,然后在一个服务线程中定时的查看该重叠IO是否完成,如果该重叠IO完成,那么就代表有客户端的连接请求。
在客户端,客户端进程首先调用WaitNamedPipe函数,将同样的管道名称pipename传入到WaitNamedPipe函数中,如果WaitNamedPipe函数返回成功,则代表连接服务器成功,然后调用CreateFile函数打开服务端的管道句柄,这样便可以与服务端进行通信了。
上面简要的概述了利用Windows操作系统的命名管道API进行服务端与客户端之间建立通信连接的简要过程,后面的步骤来详细的说明实现一个服务器进程与多个客户端进程之间进行异步通信的方法。
本实施例中,实现了通过一个NamedPipeServer的模块用来代表一个命名管道服务器,该模块实现了上述的与多个客户端之间进行异步连接以及异步数据通信的功能。
首先,通过步骤S101创建服务线程,因为本实施例中的方法采取的时异步的方式,所以,首先创建一个独立的线程来处理所有的异步任务,这些异步任务包括来自客户端的连接请求,接收来自客户端发送的数据以及向客户端发送数据。
进一步,在NamedPipeServer中有三个数据集合,这三个数据集合中,存放的都是类型为OVERLAPPED的异步重叠IO,它们分别是m_pipePendingArray,用来代表所有的异步连接,存放在第一存储空间。m_readPendingArray用来代表所有正在异步接收的请求,存放在第二存储空间;m_writePendingArray用来代表所有异步发送的请求,存放在第三存储空间。在服务线程中循环的处理这三个数据集合,后面针对客户端的异步连接、异步接收以及异步发送都是分别对这三个数据集合的处理。
然后,通过步骤S102准备客户端链接请求,在NamedPipeServer模块中调用accept函数,accept函数的主要功能是创建一个异步的命名管道句柄,然后创建一个重叠IO来异步的处理连接请求,然后将该异步连接重叠IO存放到上面的m_pipePendingArray中,从而在服务线程中处理异步连接的结果。accept函数中的主要逻辑如下:
首先,调用CreateNamedPipe函数创建一个命名管道句柄,在调用该函数时,将命名管道的名称传入到该函数的第一个参数中,然后将FILE_FLAG_OVERLAPPED传入到该函数的第二个参数中,表示要创建的是一个异步的命名管道。如果该函数的返回值不等于INVALID_HANDLE_VALUE则代表创建命名管道句柄成功。
具体的,CreateNamedPipe函数包括8个参数,第一个参数为LPCTSTRlpName,表示管道名称,最多可达256个字符的长度,而且不区分大小写。第二个参数为DWORDdwOpenMode,表示管道的打开方式。第三个参数为DWORDdwPipeMode。表示管道的模式。第四个参数为DWORDnMaxInstances,表示该管道所能够创建的最大实例数量,必须是1到常数PIPE_UNLIMITED_INSTANCES间的一个值。第五个参数是DWORDnOutBufferSize,表示管道的输出缓冲区容量,为0表示使用默认大小。第六个参数为DWORDnInBufferSize,表示管道的输入缓冲区容量,为0表示使用默认大小。第七个参数为DWORDnDefaultTimeOut,表示管道的默认等待超时。第八个参数为LPSECURITY_ATTRIBUTESlpSecurityAttributes,是安全属性参数,表示管道的安全属性。
在现有技术中,通过NamedPipeServer在调用CreateNamedPipe函数,创建命名管道句柄时,将该函数的最后一个参数,即安全属性参数默认传入的是NULL空值,那么创建的命名管道句柄的安全访问等级将使用系统默认的安全访问等级。当命名管道句柄的服务程序启动时,将出现下面四种不同的情况:
第一种:服务器端与客户端均以管理员权限启动,当命名管道句柄的通信双方都采用管理员权限启动时,客户端能够连接上服务器,双方通信正常。
第二种:服务器端以管理员权限启动,客户端以非管理员权限启动。如果服务器端以管理员权限启动,那么客户端在调用CreateFile打开服务器端创建的命名管道句柄时,因为权限不够,将会导致失败,从而导致客户端连接不上服务器端,双方通信失败。
第三种:服务器端以非管理员权限启动,客户端以管理员权限启动。当服务器端以非管理员权限启动时,那么其创建的命名管道句柄句柄也不会拥有管理员权限,当客户端以管理员权限启动时,调用CreateFile打开命名管道句柄时,能够成功,从而双方能够正常的通信。
第四种:服务器端与客户端均以非管理员权限启动。当通信双方都以普通权限启动,而非管理员权限启动时,客户端能够连上服务器,双方通信正常。
从上面的4种情况来看,当服务器端以管理员权限启动,而客户端以非管理员权限启动时,客户端会出现连不上服务器。为了解决这种情况,在步骤S102中,NamedPipeServer在调用CreateNamedPipe系统API时,不能使用默认的系统权限去创建,而应该以设置了预设安全访问属性的CreateNamedPipe函数创建异步的命名管道句柄。这样,命名管道句柄通过预设安全访问属性指定访问等级,命名管道句柄指定的访问等级使得所述服务器以管理员权限或非管理员权限创建所述命名管道句柄情况下,客户端均能访问命名管道句柄。所以,本实施例中,在创建命名管道句柄之前,需要对CreateNamedPipe函数设置预设安全访问属性,可通过如下步骤实现:
初始化安全描述符;将所述安全描述符的安全访问级别设置为最低等级;创建安全属性描述结构,将安全访问级别设置为最低等级的所述安全描述符传入所述安全属性描述结构的属性字段中;将创建的所述安全属性描述结构传入所述CreateNamedPipe函数的最后一个参数,即安全属性参数中,以使得所述CreateNamedPipe函数的安全属性设置为所述预设安全访问属性。
具体的,在本实施例中,首先初始化一个安全描述符。具体的,调用系统的InitializeSecurityDescriptor函数,初始化一个SECURITY_DESCIRPTOR的安全描述符结构。
然后,将安全描述符的安全访问级别设置为最低等级,具体的,上述初始化了一个安全描述符后,需要设置它的安全访问级别,当把其安全访问级别设置成最低时,所有的访问请求都能够成功通过。所以,本实施例中的方法,将该安全描述符的安全访问级别设置成最低,这样创建出来的命名管道句柄,不管服务器端与客户端是否以管理员权限启动,双方都能够连接成功。
具体的,将安全描述符的安全访问级别设置为最低等级,在具体实现过程中,通过调用SetSecurityDescriptorDacl系统函数,将上述的安全描述符结构SECURITY_DESCRIPTOR传入到该SetSecurityDescriptorDacl系统函数的第一个参数中,第二个参数设置为TRUE,第三个参数设置为NULL(表示最低安全访问级别)。
最后,设置CreateNamedPipe函数的预设安全访问属性。具体的,创建一个类型为SECURITY_ATTRIBUTES的安全属性描述结构,并将前述的安全描述符结构SECURITY_DESCRIPTOR设置到SECURITY_ATTRIBUTES的属性字段lpSecurityDescriptor字段中,完成之后,将SECURITY_ATTRIBUTES结构传入到CreateNamedPipe函数的最后一个参数,即安全属性参数中。这样,完成了CreateNamedPipe函数的预设安全访问属性的设置,通过该CreateNamedPipe函数创建出来的命名管道句柄其安全访问级别是最低等级,所以,不管服务器端是否以管理员权限启动,客户端都能够连接上。
接着,本实施例中的方法,还会通过步骤S102,创建一个类型为OVERLAPPED的重叠IO结构,将上步中创建的命名管道句柄传入到该结构的Pointer字段中,然后调用ConnectNamedPipe函数,异步的等待来自客户端的连接请求。
最后,将创建的OVERLAPPED重叠IO放入到对应的存储空间中去,从而在服务线程中查看处理该异步连接的结果。
对于三种不同的异步任务,处理过程可分为以下三种:
第一种:处理异步连接。
如果所述当前重叠IO为所述第一存储空间中的重叠IO,调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定有客户端连接到所述服务器;
调用onAccepted函数,在所述onAccepted函数中创建第一会话对象,调用所述第一会话对象的asyncReadSome函数,读取所述客户端发送的数据;
继续处理下一个存储空间的重叠IO。
具体的,在本实施例中,继续沿用上述示例,在服务线程中,如果当前重叠IO为第一存储空间中的重叠IO,即对于m_pipePendingArray中的每一个类型为OVERLAPPED的重叠IO,调用HasOverlappedIoCompleted函数,如果该函数返回true,那么代表已有客户端连接到服务器中,ConnectNamedPipe的结果最终得到处理,然后调用NamedPipeServer的onAccepted函数,在onAccepted函数中,主要是创建一个NamedPipeSession会话对象用来代表服务端与客户端的一个通信连接,然后调用NamedPipeSession的asyncReadSome函数,准备读取来着客户端发送的数据,最后在onAccepted函数中再次调用accpet函数。具体的过程如下:
首先,创建一个类型为NamedPipeSession的会话对象,然后将该OVERLAPPED对象中的Pointer字段赋值给NamedPipeSession的m_pipe字段,从而根据m_pipe管道句柄来与客户端进行数据通信,然后给该NamedPipeSession指定一个数字型的sessionID,用来区分不同的NamedPipeSession对象。
然后,调用NamedPipeSession对象的asyncReadSome函数,异步的读取来自客户端的数据。在asyncReadSome函数中,首先同样创建一个OVERLAPPED的重叠IO,并且将该NamedPipeSession的this指针值放入到重叠IO的Pointer字段中,然后调用操作系统的ReadFile函数去异步的读取数据,在调用ReadFile函数时,将OVERLAPPED重叠IO传入到该函数的最后一个参数中,表示以异步的方式去读区客户端的数据,否则,会以同步的方式去读区数据然后将该OVERLAPPED重叠IO存入到NamedPipeServer的m_readPendingArray中,去处理异步读取的结果。
接着,调用完asyncReadSome函数后,再次调用NamedPipeServer的accept函数,处理下一个客户端的连接请求,从而再次执行本实施例中上述S102的相关逻辑,重复这样的逻辑,从而实现了一个服务器可以连接多个客户端的逻辑。
最后,因为已成功处理完异步连接请求,所以在m_pipePendingArray中移除该重叠IO。
第二种:处理异步接收。
如果所述当前重叠IO为所述第二存储空间中的重叠IO,调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定成功接收到来自客户端发送的数据;
通过所述当前重叠IO中Pointer字段获取所述当前重叠IO对应的第二会话对象;
调用所述第二会话对象的onReadComplete函数处理接收到的数据;
调用所述第二会话对象的asyncReadSome函数,把下一个读取的重叠IO放入到所述第二存储空间;
继续处理下一个存储空间的重叠IO。
具体的,在本实施例中,在服务线程中,如果当前重叠IO为第二存储空间中的重叠IO,即对于m_readPendingArray中的每一个类型为OVERLAPPED的重叠IO,调用HasOverlappedIoCompleted函数,如果该函数返回true,那么代表成功接收到来自客户端发送的数据。从而根据OVERLAPPED结果中的Pointer字段来获取NamedPipeSession对象,然后调用该NamedPipeSession对象的onReadComplete函数,在NamedPipeSession对象的onReadComplete函数中,处理完接收到的数据后,再次调用NamedPipeSession对象的asyncReadSome函数,再次把下一个读取的异步重叠IO放入到m_readPendingArray中,从而实现了NamedPipeSession对象的异步循环读取数据。同样的道理,因为已成功处理完异步发送数据的请求,所以,可从m_readPendingArray中移除该重叠IO。
第三种:处理异步发送。
如果所述当前重叠IO为所述第三存储空间中的重叠IO,定位与所述当前重叠IO对应的第三会话对象;
调用所述第三会话对象的asyncWriteSome函数异步的发送数据至客户端;
调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定成功的将数据发送至客户端;
继续处理下一个存储空间的重叠IO。
具体的,在本实施例中,在服务线程中,如果当前重叠IO为第三存储空间中的重叠IO,即在服务线程中,对于m_writePendingArray中的每一个类型为OVERLAPPED的重叠IO,调用HasOverlappedIoCompleted函数,如果该函数返回true,那么代表成功的将数据发送到了客户端从而根据OVERLAPPED结果中的Pointer字段来获取NamedPipeSession对象,然后调用该对象的onWriteComplete函数,将该重叠IO从NamedPipeServer的m_writePendingArray中删除。
同时,当NamedPipeServer向相应的客户端发送数据时,需要将向客户端发送数据请求对应的重叠IO存储至第三存储空间。首先根据制定的会话id,即NamedPipeSession的sessionID找到相对应的会话对象NamedPipeSession,然后调用会话对象NamedPipeSession的asyncWriteSome函数异步的发送数据。在asyncWriteSome函数中,同样首先创建一个OVERLAPPED的重叠IO,同样将该NamedPipeSession的this指针,传入到重叠IO的Pointer字段中,然后调用操作系统的WriteFile函数,将重叠IO传入到WriteFile函数的最后一个参数中,表示以异步的方式发送数据。最后将该重叠IO放入到m_writePendingArray集合中。
请参见图2,本发明的第二实施例提供了一种电子设备,所述电子设备包括:
创建单元201,用于创建服务线程,所述服务线程用于处理针对客户端的异步任务,所述异步任务包括处理客户端的连接请求、接收客户端发送的数据请求以及向客户端发送数据请求;
调用单元202,用于调用accept函数,通过所述accept函数调用设置了预设安全访问属性的CreateNamedPipe函数创建异步的命名管道句柄和通过所述accept函数创建重叠IO,将所述命名管道句柄传入所述重叠IO的Pointer字段中,调用ConnectNamedPipe函数,异步等待来自客户端的所述异步任务,将所述重叠IO存放至与所述异步任务对应的存储空间中,其中,所述命名管道句柄通过所述预设安全访问属性指定访问等级,所述命名管道句柄指定的访问等级使得所述服务器以管理员权限或非管理员权限创建所述命名管道句柄情况下,所述客户端均能访问所述命名管道句柄,所述服务器中设置有用于存储所述处理客户端的连接请求对应的重叠IO的第一存储空间、用于存储所述接收客户端发送的数据请求对应的重叠IO的第二存储空间以及用于存储所述向客户端发送数据请求对应的重叠IO的第三存储空间;
处理单元203,用于通过所述服务线程循环查看所述第一存储空间、所述第二存储空间以及所述第三存储空间中的重叠IO,如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO。
所述电子设备还包括:删除单元,用于在所述如果查看到当前重叠IO处理完成之后,将所述当前重叠IO从对应的存储空间中删除。
具体的,本实施例中的电子设备主要应用于服务器端,在服务器端,服务器进程调用CreateNamedPipe函数根据一个指定的名称pipename来创建一个有名称的命名管道,然后调用ConnectNamedPipe来等待客户端的连接请求,这个函数既可以支持同步方式,又可以支持异步方式,若果服务器进程以同步方式调用ConnectNamedPipe函数,那么如果没有得到客户端的连接请求,那么会一直等到客户端的连接请求,所以此时会阻塞调用该函数的线程,当该函数返回时,客户端便与服务端建立了通信连接。如果服务端以异步的方式调用ConnectNamedPipe函数来处理客户端的连接请求,那么该函数会立即返回,不会阻塞调用该函数的线程。但是在以异步方式调用该函数时,需要指定一个结构类型为OVERLAPPED的重叠IO参数,传递给该ConnectNamedPipe函数,然后在一个服务线程中定时的查看该重叠IO是否完成,如果该重叠IO完成,那么就代表有客户端的连接请求。
在客户端,客户端进程首先调用WaitNamedPipe函数,将同样的管道名称pipename传入到WaitNamedPipe函数中,如果WaitNamedPipe函数返回成功,则代表连接服务器成功,然后调用CreateFile函数打开服务端的管道句柄,这样便可以与服务端进行通信了。
上面简要的概述了利用Windows操作系统的命名管道API进行服务端与客户端之间建立通信连接的简要过程,后面的步骤来详细的说明实现一个服务器进程与多个客户端进程之间进行异步通信的方法。
本实施例中,实现了通过一个NamedPipeServer的模块用来代表一个命名管道服务器,该模块实现了上述的与多个客户端之间进行异步连接以及异步数据通信的功能。
首先,电子设备通过创建单元201创建服务线程,因为本实施例中的方法采取的时异步的方式,所以,首先创建一个独立的线程来处理所有的异步任务,这些异步任务包括来自客户端的连接请求,接收来自客户端发送的数据以及向客户端发送数据。
进一步,在NamedPipeServer中有三个数据集合,这三个数据集合中,存放的都是类型为OVERLAPPED的异步重叠IO,它们分别是m_pipePendingArray,用来代表所有的异步连接,存放在第一存储空间。m_readPendingArray用来代表所有正在异步接收的请求,存放在第二存储空间;m_writePendingArray用来代表所有异步发送的请求,存放在第三存储空间。在服务线程中循环的处理这三个数据集合,后面针对客户端的异步连接、异步接收以及异步发送都是分别对这三个数据集合的处理。
然后,通过调用单元202准备客户端链接请求,在NamedPipeServer模块中调用accept函数,accept函数的主要功能是创建一个异步的命名管道句柄,然后创建一个重叠IO来异步的处理连接请求,然后将该异步连接重叠IO存放到上面的m_pipePendingArray中,从而在服务线程中处理异步连接的结果。accept函数中的主要逻辑如下:
首先,调用CreateNamedPipe函数创建一个命名管道句柄,在调用该函数时,将命名管道的名称传入到该函数的第一个参数中,然后将FILE_FLAG_OVERLAPPED传入到该函数的第二个参数中,表示要创建的是一个异步的命名管道。如果该函数的返回值不等于INVALID_HANDLE_VALUE则代表创建命名管道句柄成功。
具体的,CreateNamedPipe函数包括8个参数,第一个参数为LPCTSTRlpName,表示管道名称,最多可达256个字符的长度,而且不区分大小写。第二个参数为DWORDdwOpenMode,表示管道的打开方式。第三个参数为DWORDdwPipeMode。表示管道的模式。第四个参数为DWORDnMaxInstances,表示该管道所能够创建的最大实例数量,必须是1到常数PIPE_UNLIMITED_INSTANCES间的一个值。第五个参数是DWORDnOutBufferSize,表示管道的输出缓冲区容量,为0表示使用默认大小。第六个参数为DWORDnInBufferSize,表示管道的输入缓冲区容量,为0表示使用默认大小。第七个参数为DWORDnDefaultTimeOut,表示管道的默认等待超时。第八个参数为LPSECURITY_ATTRIBUTESlpSecurityAttributes,是安全属性参数,表示管道的安全属性。
在现有技术中,通过NamedPipeServer在调用CreateNamedPipe函数,创建命名管道句柄时,将该函数的最后一个参数,即安全属性参数默认传入的是NULL空值,那么创建的命名管道句柄的安全访问等级将使用系统默认的安全访问等级。当命名管道句柄的服务程序启动时,将出现下面四种不同的情况:
第一种:服务器端与客户端均以管理员权限启动,当命名管道句柄的通信双方都采用管理员权限启动时,客户端能够连接上服务器,双方通信正常。
第二种:服务器端以管理员权限启动,客户端以非管理员权限启动。如果服务器端以管理员权限启动,那么客户端在调用CreateFile打开服务器端创建的命名管道句柄时,因为权限不够,将会导致失败,从而导致客户端连接不上服务器端,双方通信失败。
第三种:服务器端以非管理员权限启动,客户端以管理员权限启动。当服务器端以非管理员权限启动时,那么其创建的命名管道句柄句柄也不会拥有管理员权限,当客户端以管理员权限启动时,调用CreateFile打开命名管道句柄时,能够成功,从而双方能够正常的通信。
第四种:服务器端与客户端均以非管理员权限启动。当通信双方都以普通权限启动,而非管理员权限启动时,客户端能够连上服务器,双方通信正常。
从上面的4种情况来看,当服务器端以管理员权限启动,而客户端以非管理员权限启动时,客户端会出现连不上服务器。为了解决这种情况,在步骤S102中,NamedPipeServer在调用CreateNamedPipe系统API时,不能使用默认的系统权限去创建,而应该以设置了预设安全访问属性的CreateNamedPipe函数创建异步的命名管道句柄。这样,命名管道句柄通过预设安全访问属性指定访问等级,命名管道句柄指定的访问等级使得所述服务器以管理员权限或非管理员权限创建所述命名管道句柄情况下,客户端均能访问命名管道句柄。所以,本实施例中,电子设备还包括安全访问属性设置单元,在创建命名管道句柄之前,需要对CreateNamedPipe函数设置预设安全访问属性,安全访问属性设置单元具体用于:
初始化安全描述符;将所述安全描述符的安全访问级别设置为最低等级;创建安全属性描述结构,将安全访问级别设置为最低等级的所述安全描述符传入所述安全属性描述结构的属性字段中;将创建的所述安全属性描述结构传入所述CreateNamedPipe函数的最后一个参数,即安全属性参数中,以使得所述CreateNamedPipe函数的安全属性设置为所述预设安全访问属性。
具体的,在本实施例中,首先初始化一个安全描述符。具体的,调用系统的InitializeSecurityDescriptor函数,初始化一个SECURITY_DESCIRPTOR的安全描述符结构。
然后,将安全描述符的安全访问级别设置为最低等级,具体的,上述初始化了一个安全描述符后,需要设置它的安全访问级别,当把其安全访问级别设置成最低时,所有的访问请求都能够成功通过。所以,本实施例中的方法,将该安全描述符的安全访问级别设置成最低,这样创建出来的命名管道句柄,不管服务器端与客户端是否以管理员权限启动,双方都能够连接成功。
具体的,将安全描述符的安全访问级别设置为最低等级,在具体实现过程中,通过调用SetSecurityDescriptorDacl系统函数,将上述的安全描述符结构SECURITY_DESCRIPTOR传入到该SetSecurityDescriptorDacl系统函数的第一个参数中,第二个参数设置为TRUE,第三个参数设置为NULL(表示最低安全访问级别)。
最后,设置CreateNamedPipe函数的预设安全访问属性。具体的,创建一个类型为SECURITY_ATTRIBUTES的安全属性描述结构,并将前述的安全描述符结构SECURITY_DESCRIPTOR设置到SECURITY_ATTRIBUTES的属性字段lpSecurityDescriptor字段中,完成之后,将SECURITY_ATTRIBUTES结构传入到CreateNamedPipe函数的最后一个参数,即安全属性参数中。这样,完成了CreateNamedPipe函数的预设安全访问属性的设置,通过调用单元202调用该CreateNamedPipe函数创建出来的命名管道句柄其安全访问级别是最低等级,所以,不管服务器端是否以管理员权限启动,客户端都能够连接上。
然后,调用单元202创建一个类型为OVERLAPPED的重叠IO结构,将上步中创建的命名管道句柄传入到该结构的Pointer字段中,然后调用ConnectNamedPipe函数,异步的等待来自客户端的连接请求。
最后,将创建的OVERLAPPED重叠IO放入到对应的存储空间中去,从而在服务线程中查看处理该异步连接的结果。
对于三种不同的异步任务,处理单元203处理过程可分为以下三种:
第一种:处理异步连接。
如果所述当前重叠IO为所述第一存储空间中的重叠IO,调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定有客户端连接到所述服务器;
调用onAccepted函数,在所述onAccepted函数中创建第一会话对象,调用所述第一会话对象的asyncReadSome函数,读取所述客户端发送的数据;
继续处理下一个存储空间的重叠IO。
具体的,在本实施例中,继续沿用上述示例,在服务线程中,如果当前重叠IO为第一存储空间中的重叠IO,即对于m_pipePendingArray中的每一个类型为OVERLAPPED的重叠IO,调用HasOverlappedIoCompleted函数,如果该函数返回true,那么代表已有客户端连接到服务器中,ConnectNamedPipe的结果最终得到处理,然后调用NamedPipeServer的onAccepted函数,在onAccepted函数中,主要是创建一个NamedPipeSession会话对象用来代表服务端与客户端的一个通信连接,然后调用NamedPipeSession的asyncReadSome函数,准备读取来着客户端发送的数据,最后在onAccepted函数中再次调用accpet函数。具体的过程如下:
首先,创建一个类型为NamedPipeSession的会话对象,然后将该OVERLAPPED对象中的Pointer字段赋值给NamedPipeSession的m_pipe字段,从而根据m_pipe管道句柄来与客户端进行数据通信,然后给该NamedPipeSession指定一个数字型的sessionID,用来区分不同的NamedPipeSession对象。
然后,调用NamedPipeSession对象的asyncReadSome函数,异步的读取来自客户端的数据。在asyncReadSome函数中,首先同样创建一个OVERLAPPED的重叠IO,并且将该NamedPipeSession的this指针值放入到重叠IO的Pointer字段中,然后调用操作系统的ReadFile函数去异步的读取数据,在调用ReadFile函数时,将OVERLAPPED重叠IO传入到该函数的最后一个参数中,表示以异步的方式去读区客户端的数据,否则,会以同步的方式去读区数据然后将该OVERLAPPED重叠IO存入到NamedPipeServer的m_readPendingArray中,去处理异步读取的结果。
接着,调用完asyncReadSome函数后,再次调用NamedPipeServer的accept函数,处理下一个客户端的连接请求,从而再次执行本实施例中上述S102的相关逻辑,重复这样的逻辑,从而实现了一个服务器可以连接多个客户端的逻辑。
最后,因为已成功处理完异步连接请求,所以在m_pipePendingArray中移除该重叠IO。
第二种:处理异步接收。
如果所述当前重叠IO为所述第二存储空间中的重叠IO,调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定成功接收到来自客户端发送的数据;
通过所述当前重叠IO中Pointer字段获取所述当前重叠IO对应的第二会话对象;
调用所述第二会话对象的onReadComplete函数处理接收到的数据;
调用所述第二会话对象的asyncReadSome函数,把下一个读取的重叠IO放入到所述第二存储空间;
继续处理下一个存储空间的重叠IO。
具体的,在本实施例中,在服务线程中,如果当前重叠IO为第二存储空间中的重叠IO,即对于m_readPendingArray中的每一个类型为OVERLAPPED的重叠IO,调用HasOverlappedIoCompleted函数,如果该函数返回true,那么代表成功接收到来自客户端发送的数据。从而根据OVERLAPPED结果中的Pointer字段来获取NamedPipeSession对象,然后调用该NamedPipeSession对象的onReadComplete函数,在NamedPipeSession对象的onReadComplete函数中,处理完接收到的数据后,再次调用NamedPipeSession对象的asyncReadSome函数,再次把下一个读取的异步重叠IO放入到m_readPendingArray中,从而实现了NamedPipeSession对象的异步循环读取数据。同样的道理,因为已成功处理完异步发送数据的请求,所以,可从m_readPendingArray中移除该重叠IO。
第三种:处理异步发送。
如果所述当前重叠IO为所述第三存储空间中的重叠IO,定位与所述当前重叠IO对应的第三会话对象;
调用所述第三会话对象的asyncWriteSome函数异步的发送数据至客户端;
调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定成功的将数据发送至客户端;
继续处理下一个存储空间的重叠IO。
具体的,在本实施例中,在服务线程中,如果当前重叠IO为第三存储空间中的重叠IO,即在服务线程中,对于m_writePendingArray中的每一个类型为OVERLAPPED的重叠IO,调用HasOverlappedIoCompleted函数,如果该函数返回true,那么代表成功的将数据发送到了客户端从而根据OVERLAPPED结果中的Pointer字段来获取NamedPipeSession对象,然后调用该对象的onWriteComplete函数,将该重叠IO从NamedPipeServer的m_writePendingArray中删除。
同时,当NamedPipeServer向相应的客户端发送数据时,需要将向客户端发送数据请求对应的重叠IO存储至第三存储空间。首先根据制定的会话id,即NamedPipeSession的sessionID找到相对应的会话对象NamedPipeSession,然后调用会话对象NamedPipeSession的asyncWriteSome函数异步的发送数据。在asyncWriteSome函数中,同样首先创建一个OVERLAPPED的重叠IO,同样将该NamedPipeSession的this指针,传入到重叠IO的Pointer字段中,然后调用操作系统的WriteFile函数,将重叠IO传入到WriteFile函数的最后一个参数中,表示以异步的方式发送数据。最后将该重叠IO放入到m_writePendingArray集合中。
请参见图3,本发明的第三实施例提供了一种电子设备,该实施例的电子设备包括:处理器301、存储器302以及存储在所述存储器中并可在所述处理器上运行的计算机程序,例如第一实施例中进程间通信方法对应的程序。所述处理器执行所述计算机程序时实现上述第一实施例中各路径检测中的步骤。或者,所述处理器执行所述计算机程序时实现上述第二实施例的电子设备中各模块/单元的功能。
示例性的,所述计算机程序可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器中,并由所述处理器执行,以完成本发明。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述所述计算机程序在所述计算机装置中的执行过程。例如,所述计算机程序可以被分割成创建单元、调用单元、处理单元的功能,各单元具体功能如下:
创建单元,用于创建服务线程,所述服务线程用于处理针对客户端的异步任务,所述异步任务包括处理客户端的连接请求、接收客户端发送的数据请求以及向客户端发送数据请求;
调用单元,用于调用accept函数,通过所述accept函数调用设置了预设安全访问属性的CreateNamedPipe函数创建异步的命名管道句柄和通过所述accept函数创建重叠IO,将所述命名管道句柄传入所述重叠IO的Pointer字段中,调用ConnectNamedPipe函数,异步等待来自客户端的所述异步任务,将所述重叠IO存放至与所述异步任务对应的存储空间中,其中,所述命名管道句柄通过所述预设安全访问属性指定访问等级,所述命名管道句柄指定的访问等级使得所述服务器以管理员权限或非管理员权限创建所述命名管道句柄情况下,所述客户端均能访问所述命名管道句柄,所述服务器中设置有用于存储所述处理客户端的连接请求对应的重叠IO的第一存储空间、用于存储所述接收客户端发送的数据请求对应的重叠IO的第二存储空间以及用于存储所述向客户端发送数据请求对应的重叠IO的第三存储空间;
处理单元,用于通过所述服务线程循环查看所述第一存储空间、所述第二存储空间以及所述第三存储空间中的重叠IO,如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO。
所述电子设备可包括,但不仅限于,处理器、存储器。本领域技术人员可以理解,所述示意图3仅仅是计算机装置的示例,并不构成对电子设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述电子设备还可以包括输入输出设备、网络接入设备、总线等。
所称处理器301可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,所述处理器是所述计算机装置的控制中心,利用各种接口和线路连接整个计算机装置的各个部分。
所述存储器302可用于存储所述计算机程序和/或模块,所述处理器通过运行或执行存储在所述存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现所述计算机装置的各种功能。所述存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、视频数据等)等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
进一步,该电子设备所包括的处理器301还具有以下功能:
初始化安全描述符;
将所述安全描述符的安全访问级别设置为最低等级;
创建安全属性描述结构,将安全访问级别设置为最低等级的所述安全描述符传入所述安全属性描述结构的属性字段中;
将创建的所述安全属性描述结构传入所述CreateNamedPipe函数的最后一个参数,即安全属性参数中,以使得所述CreateNamedPipe函数的安全属性设置为所述预设安全访问属性。
进一步,该电子设备所包括的处理器301还具有以下功能:
在所述如果查看到当前重叠IO处理完成之后,将所述当前重叠IO从对应的存储空间中删除。
进一步,该电子设备所包括的处理器301还具有以下功能:
如果所述当前重叠IO为所述第一存储空间中的重叠IO,调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定有客户端连接到所述服务器;
调用onAccepted函数,在所述onAccepted函数中创建第一会话对象,调用所述第一会话对象的asyncReadSome函数,读取所述客户端发送的数据;
继续处理下一个存储空间的重叠IO。
进一步,该电子设备所包括的处理器301还具有以下功能:
如果所述当前重叠IO为所述第二存储空间中的重叠IO,调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定成功接收到来自客户端发送的数据;
通过所述当前重叠IO中Pointer字段获取所述当前重叠IO对应的第二会话对象;
调用所述第二会话对象的onReadComplete函数处理接收到的数据;
调用所述第二会话对象的asyncReadSome函数,把下一个读取的重叠IO放入到所述第二存储空间;
继续处理下一个存储空间的重叠IO。
进一步,该电子设备所包括的处理器301还具有以下功能:
如果所述当前重叠IO为所述第三存储空间中的重叠IO,定位与所述当前重叠IO对应的第三会话对象;
调用所述第三会话对象的asyncWriteSome函数异步的发送数据至客户端;
调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定成功的将数据发送至客户端;
继续处理下一个存储空间的重叠IO。
本发明第四实施例提供了一种计算机可读存储介质,其上存储有计算机程序,本发明第二实施例中的所述电子设备集成的功能单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述第一实施例的进程间通信方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (10)
1.一种进程间通信方法,应用于服务器,其特征在于,包括:
创建服务线程,所述服务线程用于处理针对客户端的异步任务,所述异步任务包括处理客户端的连接请求、接收客户端发送的数据请求以及向客户端发送数据请求;
调用accept函数,通过所述accept函数调用设置了预设安全访问属性的CreateNamedPipe函数创建异步的命名管道句柄和通过所述accept函数创建重叠IO,将所述命名管道句柄传入所述重叠IO的Pointer字段中,调用ConnectNamedPipe函数,异步等待来自客户端的所述异步任务,将所述重叠IO存放至与所述异步任务对应的存储空间中,其中,所述命名管道句柄通过所述预设安全访问属性指定访问等级,所述命名管道句柄指定的访问等级使得所述服务器以管理员权限或非管理员权限创建所述命名管道句柄情况下,所述客户端均能访问所述命名管道句柄,所述服务器中设置有用于存储所述处理客户端的连接请求对应的重叠IO的第一存储空间、用于存储所述接收客户端发送的数据请求对应的重叠IO的第二存储空间以及用于存储所述向客户端发送数据请求对应的重叠IO的第三存储空间;
通过所述服务线程循环查看所述第一存储空间、所述第二存储空间以及所述第三存储空间中的重叠IO,如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO。
2.如权利要求1所述的方法,其特征在于,在所述调用accept函数之前,所述方法还包括:
初始化安全描述符;
将所述安全描述符的安全访问级别设置为最低等级;
创建安全属性描述结构,将安全访问级别设置为最低等级的所述安全描述符传入所述安全属性描述结构的属性字段中;
将创建的所述安全属性描述结构传入所述CreateNamedPipe函数的安全属性参数中,以使得所述CreateNamedPipe函数的安全属性设置为所述预设安全访问属性。
3.如权利要求1所述的方法,其特征在于,在所述如果查看到当前重叠IO处理完成之后,所述方法还包括:
将所述当前重叠IO从对应的存储空间中删除。
4.如权利要求1所述的方法,其特征在于,所述如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO,包括:
如果所述当前重叠IO为所述第一存储空间中的重叠IO,调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定有客户端连接到所述服务器;
调用onAccepted函数,在所述onAccepted函数中创建第一会话对象,调用所述第一会话对象的asyncReadSome函数,读取所述客户端发送的数据;
继续处理下一个存储空间的重叠IO。
5.如权利要求1所述的方法,其特征在于,所述如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO,包括:
如果所述当前重叠IO为所述第二存储空间中的重叠IO,调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定成功接收到来自客户端发送的数据;
通过所述当前重叠IO中Pointer字段获取所述当前重叠IO对应的第二会话对象;
调用所述第二会话对象的onReadComplete函数处理接收到的数据;
调用所述第二会话对象的asyncReadSome函数,把下一个读取的重叠IO放入到所述第二存储空间;
继续处理下一个存储空间的重叠IO。
6.如权利要求1所述的方法,其特征在于,所述如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO,包括:
如果所述当前重叠IO为所述第三存储空间中的重叠IO,定位与所述当前重叠IO对应的第三会话对象;
调用所述第三会话对象的asyncWriteSome函数异步的发送数据至客户端;
调用HasOverlappedIoCompleted函数查看所述当前重叠IO,如果所述HasOverlappedIoCompleted函数返回值为“true”,确定成功的将数据发送至客户端;
继续处理下一个存储空间的重叠IO。
7.一种电子设备,应用于服务器,其特征在于,包括:
创建单元,用于创建服务线程,所述服务线程用于处理针对客户端的异步任务,所述异步任务包括处理客户端的连接请求、接收客户端发送的数据请求以及向客户端发送数据请求;
调用单元,用于调用accept函数,通过所述accept函数调用设置了预设安全访问属性的CreateNamedPipe函数创建异步的命名管道句柄和通过所述accept函数创建重叠IO,将所述命名管道句柄传入所述重叠IO的Pointer字段中,调用ConnectNamedPipe函数,异步等待来自客户端的所述异步任务,将所述重叠IO存放至与所述异步任务对应的存储空间中,其中,所述命名管道句柄通过所述预设安全访问属性指定访问等级,所述命名管道句柄指定的访问等级使得所述服务器以管理员权限或非管理员权限创建所述命名管道句柄情况下,所述客户端均能访问所述命名管道句柄,所述服务器中设置有用于存储所述处理客户端的连接请求对应的重叠IO的第一存储空间、用于存储所述接收客户端发送的数据请求对应的重叠IO的第二存储空间以及用于存储所述向客户端发送数据请求对应的重叠IO的第三存储空间;
处理单元,用于通过所述服务线程循环查看所述第一存储空间、所述第二存储空间以及所述第三存储空间中的重叠IO,如果查看到当前重叠IO处理完成,继续处理下一个存储空间的重叠IO。
8.如权利要求7所述的电子设备,其特征在于,所述电子设备还包括:
安全访问属性设置单元,用于初始化安全描述符,将所述安全描述符的安全访问级别设置为最低等级,创建安全属性描述结构,将安全访问级别设置为最低等级的所述安全描述符传入所述安全属性描述结构的属性字段中,将创建的所述安全属性描述结构传入所述CreateNamedPipe函数的安全属性参数中,以使得所述CreateNamedPipe函数的安全属性设置为所述预设安全访问属性。
9.一种电子设备,其特征在于,所述电子设备包括处理器,所述处理器用于执行存储器中存储的计算机程序时实现如权利要求1-6中任一项所述的进程间通信方法的步骤。
10.一种可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-6中任一项所述的进程间通信方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810434277.3A CN108829526B (zh) | 2018-05-08 | 2018-05-08 | 一种进程间通信方法、电子设备及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810434277.3A CN108829526B (zh) | 2018-05-08 | 2018-05-08 | 一种进程间通信方法、电子设备及可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108829526A true CN108829526A (zh) | 2018-11-16 |
CN108829526B CN108829526B (zh) | 2021-02-02 |
Family
ID=64148493
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810434277.3A Active CN108829526B (zh) | 2018-05-08 | 2018-05-08 | 一种进程间通信方法、电子设备及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108829526B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109740342A (zh) * | 2018-12-20 | 2019-05-10 | 深圳市网心科技有限公司 | 获取shell执行权限的方法、系统、计算机装置及存储介质 |
CN111159789A (zh) * | 2019-12-26 | 2020-05-15 | 深信服科技股份有限公司 | 一种监控文件的方法及装置、设备、存储介质 |
CN111506368A (zh) * | 2020-04-21 | 2020-08-07 | 北京同邦卓益科技有限公司 | 对异步调用转同步调用的方法、装置、设备及存储介质 |
CN114840847A (zh) * | 2021-02-02 | 2022-08-02 | 武汉斗鱼鱼乐网络科技有限公司 | 在目标进程中安全创建线程的方法、装置、介质及设备 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5448734A (en) * | 1991-09-30 | 1995-09-05 | International Business Machines Corporation | Selective distribution of messages using named pipes |
JPH11120009A (ja) * | 1997-10-14 | 1999-04-30 | Toshiba Tec Corp | プロセス間通信制御装置 |
US20060123424A1 (en) * | 2004-12-07 | 2006-06-08 | Microsoft Corporation | Inter-process communications employing bi-directional message conduits |
CN1975680A (zh) * | 2006-11-27 | 2007-06-06 | 浙江大学 | 基于Java的进程间异步通信的实现方法 |
US20080295112A1 (en) * | 2007-05-23 | 2008-11-27 | Fabrizio Muscarella | Secure Inter-Process Communication Channel |
CN102147751A (zh) * | 2011-04-26 | 2011-08-10 | 北京新媒传信科技有限公司 | 一种多进程间的通信方法 |
CN107281756A (zh) * | 2017-05-05 | 2017-10-24 | 武汉斗鱼网络科技有限公司 | 一种组队游戏的方法和装置 |
-
2018
- 2018-05-08 CN CN201810434277.3A patent/CN108829526B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5448734A (en) * | 1991-09-30 | 1995-09-05 | International Business Machines Corporation | Selective distribution of messages using named pipes |
JPH11120009A (ja) * | 1997-10-14 | 1999-04-30 | Toshiba Tec Corp | プロセス間通信制御装置 |
US20060123424A1 (en) * | 2004-12-07 | 2006-06-08 | Microsoft Corporation | Inter-process communications employing bi-directional message conduits |
CN1975680A (zh) * | 2006-11-27 | 2007-06-06 | 浙江大学 | 基于Java的进程间异步通信的实现方法 |
US20080295112A1 (en) * | 2007-05-23 | 2008-11-27 | Fabrizio Muscarella | Secure Inter-Process Communication Channel |
CN102147751A (zh) * | 2011-04-26 | 2011-08-10 | 北京新媒传信科技有限公司 | 一种多进程间的通信方法 |
CN107281756A (zh) * | 2017-05-05 | 2017-10-24 | 武汉斗鱼网络科技有限公司 | 一种组队游戏的方法和装置 |
Non-Patent Citations (2)
Title |
---|
佚名: "Inter-Process Communication in .NET Using Named Pipes: Part 1", 《HTTPS://WWW.CODEPROJECT.COM/ARTICLES/7176/INTER-PROCESS-COMMUNICATION-IN-NET-USING-NAMED-PIP》 * |
佚名: "Windows I/O模型之重叠IO(overlapped)模型", 《HTTPS://WWW.CNBLOGS.COM/HPAHPA/P/7819498.HTML》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109740342A (zh) * | 2018-12-20 | 2019-05-10 | 深圳市网心科技有限公司 | 获取shell执行权限的方法、系统、计算机装置及存储介质 |
CN109740342B (zh) * | 2018-12-20 | 2021-08-06 | 深圳市网心科技有限公司 | 获取shell执行权限的方法、系统、计算机装置及存储介质 |
CN111159789A (zh) * | 2019-12-26 | 2020-05-15 | 深信服科技股份有限公司 | 一种监控文件的方法及装置、设备、存储介质 |
CN111506368A (zh) * | 2020-04-21 | 2020-08-07 | 北京同邦卓益科技有限公司 | 对异步调用转同步调用的方法、装置、设备及存储介质 |
CN111506368B (zh) * | 2020-04-21 | 2023-09-22 | 北京同邦卓益科技有限公司 | 对异步调用转同步调用的方法、装置、设备及存储介质 |
CN114840847A (zh) * | 2021-02-02 | 2022-08-02 | 武汉斗鱼鱼乐网络科技有限公司 | 在目标进程中安全创建线程的方法、装置、介质及设备 |
Also Published As
Publication number | Publication date |
---|---|
CN108829526B (zh) | 2021-02-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108829526A (zh) | 一种进程间通信方法、电子设备及可读存储介质 | |
CN112784989B (zh) | 推理系统、推理方法、电子设备及计算机存储介质 | |
CN109635550B (zh) | 集群数据的权限校验方法、网关及系统 | |
CN110569127B (zh) | 虚拟资源转移、发送、获取方法和装置 | |
CN109614209A (zh) | 一种任务处理方法、应用服务器及系统 | |
CN109344126B (zh) | 贴图的处理方法、装置、存储介质和电子装置 | |
CN105141603B (zh) | 通信数据传输方法及系统 | |
CN111163130A (zh) | 一种网络服务系统及其数据传输方法 | |
US11916740B2 (en) | K8S-based service deployment method and apparatus, device, and medium | |
CN111858083B (zh) | 一种远程服务的调用方法、装置、电子设备及存储介质 | |
CN112769837A (zh) | 基于WebSocket的通信传输方法、装置、设备、系统及存储介质 | |
CN104618388B (zh) | 快速注册登录方法及对应的重置服务器、信息服务器 | |
CN112702362B (zh) | Tcp/ip协议栈的增强方法、装置、电子设备及存储介质 | |
CN108874564A (zh) | 一种进程间通信方法、电子设备及可读存储介质 | |
CN110324722B (zh) | 直播间中数据的获取方法、装置、设备和存储介质 | |
US20050188070A1 (en) | Vertical perimeter framework for providing application services | |
CN110086881A (zh) | 业务处理方法、装置及设备 | |
CN115883669A (zh) | 一种数据分发方法、系统、设备和介质 | |
CN110018908A (zh) | 一种进程间通信方法、电子设备及可读存储介质 | |
CN112417402B (zh) | 权限控制方法、权限控制装置、权限控制设备及存储介质 | |
CN109067551A (zh) | 一种实名认证方法、计算机可读存储介质和终端设备 | |
CN115269117A (zh) | 一种资源创建方法、装置、计算机设备及存储介质 | |
CN103297455B (zh) | 浏览器间的连接共享方法和装置 | |
CN110162415B (zh) | 用于处理数据请求的方法、服务器、装置及存储介质 | |
CN107872687A (zh) | 监控系统中权限分配方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |