命名管道用法简介

命名管道用的最多的地方就是进程间通信,它的原理是通过文件映射的方式实现的,进程间数据的传输直接在内存中进行,所以它的效率是很高的。

下面简单介绍一下命名管道的使用。 命名管道的使用方式是服务器/客户端模式的,服务器端负责管道的创建,等待客户端连接,断开客户端链接等操作,客户端则链接上服务器,进而读写数据。

 首先看服务器端,服务器端首先应该创建一个管道,通过WIN PAI接口CreateNamedPipe 来创建。它的接口原型如下:
HANDLE CreateNamedPipe( LPCTSTR lpName ,                                                    
 DWORD
dwOpenMode ,
 
DWORD dwPipeMode ,                                                    
 
DWORD nMaxInstances ,
DWORD nOutBufferSize
DWORD nInBufferSize ,
DWORD nDefaultTimeOut ,
LPSECURITY_ATTRIBUTES lpSecurityAttributes );

这里要做出说明的是参数lpName的格式是 //./pipe/pipename 其 中pipename是管道名,可以任意指定,但是整个长度不能超过256个字符。dwOpenMode分为消息模式和字节流模式,消息模式的意思是管道某 一端一次写入多少数据,那么另一端也一次会读出这么多的数据,他们是一一对应的关系。但是字节流模式是可以调整的。其他参数的具体含义可参考MSDN。

 服务器端创建完管道之后,接下来就是等待客户端的连接,这个动作可以通过ConnectNamedPipe 接口来实现,它的接口原型是

BOOL ConnectNamedPipe( HANDLE hNamedPipe ,
LPOVERLAPPED lpOverlapped );


其中,hNamePipe是CreateNamedPipe 返回的管道句柄,lpOverlapped是用于异步式管道的。如果不 用异步IO的话,这个参数可以传为null。若管道不是异步IO的,那么ConnectNamePipe直到等到客户端链接成功后才返回,如果是异步 IO,那么此函数将立即返回。对于异步IO,可以参考如下代码:   

OVERLAPPED ovlap;    
ZeroMemory (&ovlap, sizeof (OVERLAPPED));    
ovlap.hEvent = _hEvents[0];       
 // wait for client connnecting the pipe server   
 if (::ConnectNamedPipe (_hPipe, &ovlap) == FALSE) {        
        DWORD err = ::GetLastError ();              
      if (err != ERROR_PIPE_CONNECTED && err != ERROR_IO_PENDING)           
            return CLIENT_UNKNOWN_RESULT;           
}    

DWORD dwReturn = ::WaitForMultipleObjects (1, _hEvents, FALSE, INFINITE);    
switch (dwReturn)     {        
        // hEvents[0] was signaled    
       case WAIT_OBJECT_0 + 0:        
                 return CLIENT_PIPE_CONNECTED;      
        // Return value is invalid.    
       default:       
                  break;   
 }  


客户端与服务器端通信完成后,服务器首先要调用 DisConnectNamedPipe接口,这个接口用于断开服务器与前一个客户端 的链接。如果在一个新的客户端链接服务器之前,没有调用这个接口,那么ConnectNamedPipe接口将返回0。这就说明管道服务器在同一时刻只能与一个客户端通信。

再来看看客户端,客户端等管道服务器创建管道后,调用WaitNamedPipe去等待可链接的服务器。它的函数原型为:

 BOOL WaitNamedPipe( LPCTSTR lpNamedPipeName
DWORD nTimeOut );

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值