具体实施方式
本发明实施例提供了一种基于FIFO命名管道进行双工通信的方法及相关设备,用于解决现有技术中在Linux系统中利用FIFO管道只能实现进程间的半双工通信的问题。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参阅图1,为本发明实施例提供的一种可能的基于FIFO命名管道进行双工通信的方法的流程图,具体包括:
为便于更好的理解本发明实施例,将对本发明实施例进行简要说明:在本发明实施例中,用FIFO服务器即FIFOServer代表一个命名管道服务器,其主要功能是用来监听来自FIFO客户端即FIFOClient命名管道客户端的连接请求,然后创建一个FIFO会话对象同FIFOClient进行数据通信。因此本发明实施例的设计模型是一个C/S的客户端与服务器模型,其中该模型中有一个FIFOServer的命名管道服务器对象,对于N个FIFOClient命名管道客户端,FIFOServer会创建N个FIFOSession会话对象,一个FIFOSession对象同与之对应的FIFOClient之间进行全双工通信。
由于Linux系统本身的FIFO命名管道是半双工的,为了实现FIFO会话对象同FIFOClient之间的全双工通信,在FIFOClient与FIFOSession内部各自创建一个FIFO命名管道,标记为m_localPipe,分别称之为第一本地命名管道和第二本地命名管道;并且在FIFOClient中打开FIFOSession创建的第二本地命名管道,标记为m_remotePipe,称之为第一远程命名管道;同理,在FIFOSession中也打开在FIFOClient中创建的第一本地命名管道,称之为第二远程命名管道。因此,在每个FIFOClient与FIFOSession中,都存在两个FIFO命名管道,一个是本地命名管道,一个是远程命名管道。
需要说明的是,在本发明实施例中,FIFOClient与FIFOSession对象只能在各自的本地命名管道m_localPipe上接收数据,并且只能向远程命名管道m_remotePipe上发送数据。这样当FIFOClient向其对端的第一远程命名管道m_remotePipe发送数据时,FIFOSession对象就能够从其第二本地命名管道上接收到来自FIFOClient的数据;同理,当FIFOSession也向其第二远程命名管道上发送数据时,FIFOClient对象也能够从其第一本地命名管道上接收到来自FIFOSession所发送的数据。这样便实现了FIFOClient与FIFOSession之间的全双工通信。
上述双工通信过程实现的前提条件是,FIFOClient已经成功的同FIFOServer建立了连接,从而FIFOServer会创建一个FIFOSession与该FIFOClient进行双工通信。基于此,请结合图1,将对本发明提供的基于FIFO命名管道进行双工通信的方法进行具体说明,包括:
101、FIFOServer注册服务名称端口,并创建监听连接命名管道;
首先,FIFO服务器创建监听连接命名管道,该监听连接命名管道用于接收FIFOClient发送的连接建立请求消息。其中,FIFOServer具体创建监听连接命名管道的方式可以包括:通过Linux系统的mkFIFO函数,将服务名称为XXX的字符串传入该mkFIFO函数的第一个参数中,并将0777(注意前面的0,代表8进制数据,该值代表创建的命名管道对于任何用户都具有可读可写可执行的权限)传入到该mkFIFO函数的第二个参数中,并判断该函数的返回值,如果该函数的返回值为0,则代表创建名称为XXX的监听连接命名管道成功。
102、FIFOServer打开监听连接命名管道;
在创建监听连接命名管道成功后,打开该监听连接命名管道。具体地,基于步骤101,在创建名称为XXX的监听连接命名管道后,调用Linux系统的open函数,同样将管道的名称XXX字符串传入到该open函数的第一个参数中,并将O_RDWR(可读可写)以及O_NONBLOCK(非阻塞)进行或运算之后的结果,传入到该open函数的第二个参数中,如果该open函数调用成功则返回一个非0值的管道描述符,标记为m_listenPipe。这样所创建的m_listenPipe将以非阻塞的方式进行读写。
需要说明的是,该监听连接明明管道只能接收数据,不能发送数据。
103、FIFOClient获取FIFOServer注册的服务名称端口;
FIFOClient通过调用open函数获取FIFOServer所注册的名称为XXX的连接监听管道listenPipe。
104、FIFOClient创建第一本地命名管道;
如果在步骤103中,FIFOClient调用的open函数的返回值等于0,则创建一个目标随机GUID字符串,并通过该目标GUID字符串创建第一本地命名管道。具体的,在创建一个该目标GUID字符串后,调用mkFIFO函数,将第一本地命名管道的标识信息即该目标GUID字符串传入到该mkFIFO函数第一个参数中,并将0777传入到该mkFIFO函数第二个参数中,从而创建第一本地命名管道,即调用mkFIFO(目标GUID,0777)创建第一本地命名管道。然后调用open函数,将目标GUID作为第一个参数传入,将O_RDWR以及O_NONBLOCK或运算之后的值传入到该open函数的第二参数中,可以理解为,open(目标GUID,O_RDWR|O_NONBLOCK)系统函数,从而获取到第一本地命名管道描述符。
105、FIFOServer接收FIFOClient发送的连接建立请求消息;
FIFOClient打开FIFOServer中用于监听连接的监听连接命名管道,将目标GUID字符串填充到FIFOMessageConnect的portName字段中,然后调用write(listenPipe,FIFOMessageConnect)函数向FIFOServer发送连接建立请求消息,其中write函数的第一个参数listenPipe为FIFOClient在步骤103获取的连接监听管道listenPipe。
在FIFOServer侧,FIFOServer打开监听连接命名管道,创建一个线程来循环的处理来自FIFO客户端的连接建立请求消息,并接收每个FIFOSession对应的FIFOClient的消息。在线程循环中,通过调用FIFOServer的listenPortLoop函数来处理来自客户端的连接建立请求消息,通过recvSessionMsg函数,来接收m_sessions列表中所有FIFOSession与之对应的FIFOClient所发送的消息。
在listenPortLoop函数中通过调用read系统函数,将m_listenPipe传入到该read系统函数的第一个参数中,从而接收来自FIFOClient的连接建立请求消息。由于是以O_NONBLOCK非阻塞的方式去接收数据,所以当该read系统函数返回值大于0时,表示成功的接收到了连接建立请求消息,当该read系统函数返回值小于0时,表示该管道中没有连接建立请求消息。如果read系统函数返回值大于0,则表示成功的接收到了一个FIFOMessageConnect连接请求消息。
需要说明的是,该连接建立请求消息包括FIFOClient的第一本地命名管道的标识信息,该第一本地命名管道用于FIFOClient接收信息。
106、FIFOServer根据连接建立请求消息创建与FIFOClient对应的FIFO会话;
在FIFOServer接收到FIFOClient的连接建立请求消息后,根据该连接建立请求消息创建与FIFOClient对应的FIFO会话即FIFOSession。具体的,通过调用FIFOServer的allocSession函数,创建一个FIFOSession会话实例,然后调用FIFOSession的createFrom方法来初始化该FIFOSession,该createFrom函数有两个特别重要的参数,一个是remotePipeName,代表FIFOClient的第一远程命名管道,一个是localPipeName代表该FIFOSession的第二本地命名管道。
由于FIFOClient在向FIFOServer发送FIFOMessageConnect即连接建立请求消息时,会带有FIFOClient的第一本地命名管道的标识信息,该第一本地命名管道的标识信息可用一个portName的字符串表示,该字符串即为createFrom所需要的remotePipeName参数;而localPipeName则通过生成一个随机的全局唯一标识符(globally uniqueidentifier,GUID)字符串来代表,从而保证所有的用于FIFOClient与FIFOSession之间的第二本地命名管道的名称不重复。
同时,在创建FIFOSession后,FIFOServer将创建的FIFOSession放入到m_sessions列表中进行管理。
107、FIFOServer创建FIFO会话中的第二本地命名管道;
同样的,FIFOServer还需创建FIFO会话中的第二本地命名管道。创建第二本地命名管道的方式可以具体包括:同样调用mkFIFO函数,将localPipeName参数(即第二本地命名管道的标识信息)传入到该mkFIFO函数第一个参数中,并将0777传入到该mkFIFO函数第二个参数中,从而创建第二本地命名管道;然后调用open函数,将localPipeName作为第一个参数传入,将O_RDWR以及O_NONBLOCK或运算之后的值传入到该open函数的第二参数中,从而获取到第二本地命名管道描述符m_localPipe。
108、FIFOServer打开第二远程命名管道;
调用open函数,将remotePipeName(FIFOClient的第一远程命名管道)传入到该open函数中,从而获取到FIFOClient中所创建的第一本地命名管道,也就是FIFOSession的第二远程命名管道m_remotePipe。
109、FIFOServer向FIFOClient发送连接建立请求响应消息;
响应于连接建立请求消息,FIFOServer通过FIFOSession的第二远程命名管道向FIFOClient发送连接建立请求响应消息,该连接建立请求响应消息包括第二本地命名管道的标识信息,以使得FIFOClient通过第一远程命名管道向FIFOSession发送信息,其中第一远程命名管道为在FIFOClient中与第二本地命名管道对应的管道。
具体地,在上述步骤106中的createFrom完成之后,便成功的创建了一个FIFOSession,同FIFOClient进行通信。此时必须向FIFOClient发送一个FIFOMessageConnectResult的连接建立请求响应消息,该连接建立请求响应消息中包含有在步骤106中创建的localPipeName字符串,即FIFOSession的第二本地命名管道的标识信息。FIFOClient通过向该localPipeName所对应的第一远程命名管道上向该FIFOSession发送消息。
在FIFOClient侧,FIFOClient发送了连接建立请求消息后,调用read(m_localPipe,FIFOMessageConnectResult)函数接收来自FIFOServer的FIFOMessageConnectResult连接建立请求响应消息(其中read函数的第一个参数为FIFOClient的第一本地命名管道的标识信息。
110、FIFOClient向FIFOServer发送数据。
FIFOClient接收到连接建立请求响应消息后,获取连接建立请求响应消息FIFOMessageConnectResult结构中的portName字段,然后调用open函数获取portName所对应的第一远程命名管道m_remotePipe,从而FIFOClient便可以通过该第一远程命名管道通过FIFOSession向FIFOServer发送数据。
在FIFOServer侧,通过recvSessionMsg函数接收FIFOClient发送的数据。具体地,FIFOServer在recvSessionMsg函数中对m_sessions列表中的所有FIFOSession进行读取操作,也就是调用FIFOSession的read方法,来获取来自FIFOClient的消息。同样在FIFOSession的read方法中,调用Linux系统的read(m_localPipe)方法,将FIFOSession的m_localPipe传入到该函数第一个参数中,如果该函数返回值大于0,则成功获取到FIFO客户端发送的数据。
本申请实施例中,讲述了FIFOServer如何监听来自FIFOClient的连接请求,以及创建相应的FIFOSession同FIFOClient进行数据通信,以及向FIFOClient发送FIFOMessageConnectResult连接建立请求响应消息。实现了利用Linux命名管道进行一对多的进程间双工通信的方法。在该通信过程开始时,FIFOServer只需要注册一个任意的不存在的服务名称,FIFOClient便可以建立起连接,从而实现进程间的双工通信。
上面从基于FIFO命名管道进行双工通信的方法的角度对本发明实施例进行了描述,下面分别从FIFO服务器和FIFO客户端的角度分别对本发明实施例进行描述。
请参阅图2,图2为本发明实施例提供的FIFO服务器的一个实施例示意图,该服务器,具体包括:
收发单元201,用于接收FIFO客户端发送的连接建立请求消息,所述连接建立请求消息包括所述FIFO客户端的第一本地命名管道的标识信息,所述第一本地命名管道用于所述FIFO客户端接收信息;
创建单元202,用于根据所述连接建立请求消息创建与所述FIFO客户端对应的FIFO会话,所述FIFO会话包括第二本地命名管道和第二远程命名管道,所述第二本地命名管道用于所述FIFO会话接收信息,所述第二远程命名管道为在所述FIFO会话中与所述第一本地命名管道对应的管道,所述第二远程命名管道用于向所述FIFO客户端发送信息;
响应于所述连接建立请求消息,所述收发单元201还用于通过所述FIFO会话的第二远程命名管道向所述FIFO客户端发送连接建立请求响应消息,所述连接建立请求响应消息包括所述第二本地命名管道的标识信息,以使得所述FIFO客户端通过第一远程命名管道向所述FIFO会话发送信息,所述第一远程命名管道为在所述FIFO客户端中与所述第二本地命名管道对应的管道。
可选的,在一些可能的实现方式中,所述创建单元202具体包括:
创建模块2021,用于根据所述第一本地命名管道的标识信息创建所述第二本地命名管道,所述第二本地命名管道的标识信息为所述FIFO服务器随机生成;
获取模块2022,用于根据所述第一远程命名管道的标识信息获取所述第二远程命名管道。
请参阅图3,图3为本发明实施例提供的客户端的一个实施例示意图,该FIFO客户端,具体包括:
第一收发单元301,用于向FIFO服务器发送连接建立请求消息,所述连接建立请求消息包括所述FIFO客户端的第一本地命名管道的标识信息,所述第一本地命名管道用于所述FIFO客户端接收信息,以使得所述FIFO服务器根据所述连接建立请求创建FIFO会话,所述FIFO会话包括第二本地命名管道和第二远程命名管道,所述第二本地命名管道用于所述FIFO会话接收信息,所述第二远程命名管道为在所述FIFO会话中与所述第一本地命名管道对应的管道,所述第二远程命名管道用于向所述FIFO客户端发送信息;
第二收发单元302,用于通过所述第一本地命名管道接收所述FIFO服务器发送的连接建立请求响应消息,所述连接建立请求响应消息包括第二本地命名管道的标识信息;通过第一远程命名管道向所述FIFO会话发送信息,所述第一远程命名管道为在所述FIFO客户端中与所述第二本地命名管道对应的管道。
请参阅图4,图4为本发明实施例提供的电子设备的实施例示意图。
如图4所示,本发明实施例提供了一种电子设备,包括存储器410、处理器420及存储在存储器420上并可在处理器420上运行的计算机程序411,处理器420执行计算机程序411时实现以下步骤:接收FIFO客户端发送的连接建立请求消息,所述连接建立请求消息包括所述FIFO客户端的第一本地命名管道的标识信息,所述第一本地命名管道用于所述FIFO客户端接收信息;根据所述连接建立请求消息创建与所述FIFO客户端对应的FIFO会话,所述FIFO会话包括第二本地命名管道和第二远程命名管道,所述第二本地命名管道用于所述FIFO会话接收信息,所述第二远程命名管道为在所述FIFO会话中与所述第一本地命名管道对应的管道,所述第二远程命名管道用于向所述FIFO客户端发送信息;响应于所述连接建立请求消息,通过所述FIFO会话的第二远程命名管道向所述FIFO客户端发送连接建立请求响应消息,所述连接建立请求响应消息包括所述第二本地命名管道的标识信息,以使得所述FIFO客户端通过第一远程命名管道向所述FIFO会话发送信息,所述第一远程命名管道为在所述FIFO客户端中与所述第二本地命名管道对应的管道。
可选的,所述处理器具体用于:
根据所述第一本地命名管道的标识信息创建所述第二本地命名管道,所述第二本地命名管道的标识信息为所述FIFO服务器随机生成;根据所述第一远程命名管道的标识信息获取所述第二远程命名管道。
在具体实施过程中,处理器420执行计算机程序411时,可以实现图1对应的实施例中任一实施方式。
由于本实施例所介绍的电子设备为实施本发明实施例中一种服务器所采用的设备,故而基于本发明实施例中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本发明实施例中的方法不再详细介绍,只要本领域所属技术人员实施本发明实施例中的方法所采用的设备,都属于本发明所欲保护的范围。
请参阅图5,图5为本发明实施例提供的一种计算机可读存储介质的实施例示意图。
如图5所示,本实施例提供了一种计算机可读存储介质500,其上存储有计算机程序511,该计算机程序511被处理器执行时实现如下步骤:接收FIFO客户端发送的连接建立请求消息,所述连接建立请求消息包括所述FIFO客户端的第一本地命名管道的标识信息,所述第一本地命名管道用于所述FIFO客户端接收信息;根据所述连接建立请求消息创建与所述FIFO客户端对应的FIFO会话,所述FIFO会话包括第二本地命名管道和第二远程命名管道,所述第二本地命名管道用于所述FIFO会话接收信息,所述第二远程命名管道为在所述FIFO会话中与所述第一本地命名管道对应的管道,所述第二远程命名管道用于向所述FIFO客户端发送信息;响应于所述连接建立请求消息,通过所述FIFO会话的第二远程命名管道向所述FIFO客户端发送连接建立请求响应消息,所述连接建立请求响应消息包括所述第二本地命名管道的标识信息,以使得所述FIFO客户端通过第一远程命名管道向所述FIFO会话发送信息,所述第一远程命名管道为在所述FIFO客户端中与所述第二本地命名管道对应的管道。
可选的,该计算机程序511被处理器执行时具体用于实现如下步骤:根据所述第一本地命名管道的标识信息创建所述第二本地命名管道,所述第二本地命名管道的标识信息为所述FIFO服务器随机生成;根据所述第一远程命名管道的标识信息获取所述第二远程命名管道。
请参阅图6,为本发明实施例提供的另一种电子设备的实施例示意图。
如图6所示,本发明实施例提供了一种电子设备,包括存储器610、处理器620及存储在存储器620上并可在处理器620上运行的计算机程序611,处理器620执行计算机程序611时实现以下步骤:向FIFO服务器发送连接建立请求消息,所述连接建立请求消息包括所述FIFO客户端的第一本地命名管道的标识信息,所述第一本地命名管道用于所述FIFO客户端接收信息,以使得所述FIFO服务器根据所述连接建立请求创建FIFO会话,所述FIFO会话包括第二本地命名管道和第二远程命名管道,所述第二本地命名管道用于所述FIFO会话接收信息,所述第二远程命名管道为在所述FIFO会话中与所述第一本地命名管道对应的管道,所述第二远程命名管道用于向所述FIFO客户端发送信息;通过所述第一本地命名管道接收所述FIFO服务器发送的连接建立请求响应消息,所述连接建立请求响应消息包括第二本地命名管道的标识信息;通过第一远程命名管道向所述FIFO会话发送信息,所述第一远程命名管道为在所述FIFO客户端中与所述第二本地命名管道对应的管道。
在具体实施过程中,处理器620执行计算机程序611时,可以实现图1对应的实施例中任一实施方式。
由于本实施例所介绍的电子设备为实施本发明实施例中一种客户端所采用的设备,故而基于本发明实施例中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本发明实施例中的方法不再详细介绍,只要本领域所属技术人员实施本发明实施例中的方法所采用的设备,都属于本发明所欲保护的范围。
请参阅图7,图7为本发明实施例提供的一种计算机可读存储介质的实施例示意图。
如图7所示,本实施例提供了一种计算机可读存储介质700,其上存储有计算机程序711,该计算机程序711被处理器执行时实现如下步骤:向FIFO服务器发送连接建立请求消息,所述连接建立请求消息包括所述FIFO客户端的第一本地命名管道的标识信息,所述第一本地命名管道用于所述FIFO客户端接收信息,以使得所述FIFO服务器根据所述连接建立请求创建FIFO会话,所述FIFO会话包括第二本地命名管道和第二远程命名管道,所述第二本地命名管道用于所述FIFO会话接收信息,所述第二远程命名管道为在所述FIFO会话中与所述第一本地命名管道对应的管道,所述第二远程命名管道用于向所述FIFO客户端发送信息;通过所述第一本地命名管道接收所述FIFO服务器发送的连接建立请求响应消息,所述连接建立请求响应消息包括第二本地命名管道的标识信息;通过第一远程命名管道向所述FIFO会话发送信息,所述第一远程命名管道为在所述FIFO客户端中与所述第二本地命名管道对应的管道。
需要说明的是,在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详细描述的部分,可以参见其它实施例的相关描述。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包括这些改动和变型在内。