管道分为两种,一种是匿名管道,一种是命名管道。两者都可以进行进程间的通信,但匿名管道有局限性,它只能在本机上使用,而不能跨网络使用。但是命名管道就不一样了,它弥补了匿名管道的局限性。接下来看下,如何在windows平台下,进行命名管道的通信。
首先,要进行两个进行间的通信,必须要有一个进程主动一点,来创建一个命名的管道,调用CreateNamedPipe即可创建一个命名的管道,其声明如下:
HANDLE CreateNamedPipe(
LPCTSTR lpName, // 管道名称,形式必须为\\.\pipe\pipeName
DWORD dwOpenMode, // 打开管道的模式
DWORD dwPipeMode, // 管道的模式,传输数据的形式
DWORD nMaxInstances, // 最大连接客户端的个数
DWORD nOutBufferSize, // 输出缓冲区的大小
DWORD nInBufferSize, // 输入缓冲区的大小
DWORD nDefaultTimeOut, // 默认的超时时间
LPSECURITY_ATTRIBUTES lpSecurityAttributes // 安全属性,一般为NULL
);
创建管道的进程,我们称之为服务器,当我们创建完管道之后,服务器得知道什么时候有客户端进行连接,我们可以通过一个OVERLAPPED这个结构,该结构里有一个event事件,当有客户端进行连接时,事件对象就变成有信号。有了事件之后,我们就可以调用ConnectNamedPipe来等待一个客户端的连接,其声明如下: