以前在学习Linux编程的时候也学过Linux下的命名管道;依稀Linux使用命名管道会创建一个*.fifo的文件,然后使用返回的文件描述符进行操作。具体细节也忘得差不多了。
在Win32的命名令管道和Linux下的命名管道还是很一定程序上的差别,现在也不大记得具体差别有多少。记得好像Linux的命名管道只能在本地计算机中进行通讯(现在不是很确定),Win32的应用程序下却可以应用于网络通讯(类似于套接字)。在这里只记叙Win32命名管道的实现,不作Linux的对比,和Linux相比之下还是有很大的区别的。
在Win32下命名管道也是类似于在命名管道的客户端创建某个文件来进行通讯。Win32命名管道有服务端和客户端的区别。使用Win32异命(overlapper)状态的命名管道有以下步骤:
服务端:
1、创建命名管道 :
HANDLE CreateNamedPipe(
LPCTSTR lpName,
DWORD dwOpenMode,
DWORD dwPipeMode,
DWORD nMaxInstances,
DWORD nOutBufferSize,
DWORD nInBufferSize,
DWORD nDefaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
2、创建事件对象:
HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName ); bManualReset为TRUE;
bInitialState必须为FALSE;
将这个创建后的事件对象的句柄附值连接命名管道时的OVERLAPPED结构体中的hEvent成员。
3、连接命名管道:
BOOL ConnectNamedPipe( HANDLE hNamedPipe, LPOVERLAPPED lpOverlapped );
OVERLAPPED结构中的hEven直接用CreateEvent返回的对象附值,其他成员附值为0;
这个函数会返回失败,需要获取GetLassError()的返回值是不是ERROR_IO_PENDING,是的话才正确。
4、等待客户端连接:
DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 主要用于等待客户端连接,只要有客户端连接,该函数便会返回,或timeout时返回。
5、命名管道:
命名管道可以使用有多种读写方法,这里使用ReadFile和WriteFile;对无数据的命名管道读的时候会阻塞。
客户端内容:
1、查询是否存在有可用的命名管道
BOOL WaitNamedPipe( LPCTSTR lpNamedPipeName, DWORD nTimeOut );2、打开命名管道HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); 打开失败时,命名管道被其他客户端打开或且命名管道服务端已经关闭。3、命名管道读取:同:服务端的 5、。