取名管道

取名管道屏蔽了底层的网络协议细节,在不打听网络协议的状态下也可以采取命名管道来促成进程间通信;命名管道不仅可以在本机上贯彻多少个过程间的通信,还足以跨网络实现三个过程间的通信;

1、成立命名管道

  HANDLE CreateNamedPipe(

      LPCTSTR lpName,   

      DWORD dwOpenMode,     

      DWORD dwPipeMode,      

      DWORD nMaxInstances,   

      DWORD nOutBufferSize,  

      DWORD nInBufferSize,   

      DWORD nDefaultTimeOut, 

      LPSECURITY_ATTRIBUTES lpSecurityAttributes 

  );

      lpName:指向一个字符串,该字符串的格式必须为:“\\.\pipe\pipename”;该字符串先河是六个连续的反斜杠,其后的圆点表示是本土机械,假使要与远程的服务器建立连接,应在圆点地方处指定这一个远程服务器的称谓;接下去是“pipe”这么些原则性不可改变的字符串,大小写无所谓;最终是所创立的命名管道的名号;

      dwOpenMode:指定管道的走访格局、重叠格局、写直通格局、管道句柄的安全访问情势;

        管道访问形式:

          PIPE_ACCESS_DUPLEX 
–双向形式,服务器进程和客户端进程都足以从管道读取数据和向管道中写入数据;

          PIPE_ACCESS_INBOUND 
–服务器端只好从管道中读取数据,客户端只好向管道写入数据;

          PIPE_ACCESS_OUTBOUND 
–服务器只可以向管道中写入数据,客户端只可以从管道中读取数据;

        重叠形式和写直通形式:

          FILE_FLAG_WRITE_THROUGH 
–允许写直通方式;该措施只影响对字节类型管道的写入操作,并且唯有当客户端和服务器端位于不同的总括机上时才使得;假若选用该办法,只有等到欲写入命名管道的数目通过网络传递过去,并且位居了中距离总结机的管道缓冲区中后,写多少的函数才会成功重临;

          FILE_FLAG_OVERLAPPED 
–允许重叠形式;如果运用该方法,那多少个急需一定时间才能成就的读写操作会立刻赶回,前台线程可进行此外操作,而耗时的操作可以在后台举行;

        管道句柄的平安访问模式:

          WRITE_DAC 
–调用者对命名管道的随机访问控制列表(ACL)都得以开展写入访问;

          WRITE_OWNER 
–调用者对命名管道的主人可以拓展写入访问;

          ACCESS_SYSTEM_SECURITY 
–调用者对命名管道的安全访问控制列表(SACL)可以展开写入访问;

      dwPipeMode:指定管道句柄的品类、读取、等待格局;同一个命名管道的每一个实例必须具有同样的门类,但不同实例可以指定不同的读取形式和等待形式;字节格局只可以用字节流格局读取,而消息情势既可以用音讯流格局读取也足以用字节流情势读取;设为0时取默认值;

        管道句柄的品类:

          PIPE_TYPE_BYTE 
–数据以字节流的款式写入管道,该项目不可能在PIPE_READMODE_MESSAGE读格局下使用;默认类型;

          PIPE_TYPE_MESSAGE  –数据以新闻流的花样写入管道;

        管道句柄的读取形式:

          PIPE_READMODE_BYTE 
–以字节流的措施从管道读取数据;默认模式;

          PIPE_READMODE_MESSAGE 
–以音信流的不二法门从管道读取数据,该方法只可以在PIPE_TYPE_MESSAGE情势下行使;

        管道句柄的等待形式:

          PIPE_WAIT  –阻塞形式;默认模式;

          PIPE_NOWAIT –非阻塞形式;

      n马克斯Instances:指定管道可以创设的最多实例数;取值范围为:1~PIPE_UNLIMITED_INSTANCES,如果是PIPE_UNLIMITED_INSTANCES则足以创设的管道实例数目仅受限于系统可使用的资源;

      nOutBufferSize:指定为出口缓冲区所保存的字节数;

      nInBufferSize:指定为输入缓冲区所保存的字节数;

      nDefault提姆eOut:指定默认的超时值,单位为ms;同一个管道的不比实例必须指定相同的超时值;

      lpSecurityAttributes:指向SECURITY_ATTRIBUTES结构的指针,可以安装为NULL;

2、让服务器端等待客户端的连接请求

  BOOL ConnectNamedPipe(

      HANDLE hNamedPipe,       

      LPOVERLAPPED lpOverlapped  

  );

      hNamedPipe:指向一个命名管道实例的劳务器端的句柄,该句柄即为CreateNamedPipe函数的再次来到值;

      lpOverlapped:指向OVERLAPPED结构体的指针;假若hNamedPipe参数所标识的管道是用FILE_FLAG_OVERLAPPED标记打开的,则那些参数所指向的OVERLAPPED结构体中务必包含人工重置事件目的句柄;

3、客户端等待可用的命名管道

  BOOL WaitNamedPipe(

      LPCTSTR lpNamedPipeName,

      DWORD nTimeOut           

  );

      lpNamedPipeName:指定命名管道的称呼,名称格式为:“\\.\pipe\pipename”,假设服务器端和客户端在同一总计机上,名称起始的五个反斜杠后为圆点;假倘若跨网络通信,则在圆点地点处应指定服务器端所在主机名;

      n提姆eOut:指定超时间隔,包括:

        NMPWAIT_USE_DEFAULT_WAIT 
–超时间隔就是劳务器端成立该命名管道时指定的超时值;

        NMPWAIT_WAIT_FOREVER 
–一直等待,直到出现一个可用的命名管道的实例

 

相关文章