码迷,mamicode.com
首页 > Windows程序 > 详细

Windows进程间通信--命名管道

时间:2015-04-15 11:01:08      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

1、相关概述

    命名管道(Named Pipes)是一种简单的进程间通信(IPC)机制。命名管道可以在同一台计算机的不同进程之间,或者跨越一个网络的不同计算机的不同进程之间的可靠的双向或单向的数据通信。

    命名管道利用了微软网络提供者(MSNP)重定向器,因此无需涉及底层的通信协议等细节。命名管道是围绕windows文件系统设计的一种机制,采用“命名管道文件系统”(Named Pipe File System,NPFS)接口。因此,客户端和服务端均可以使用标准的WIN32文件系统API函数(如ReadFile和WriteFile)来进行数据的收发。

 命名管道的命名规范遵循“通用命名规范(UNC)” :

  \\server\pipe[\path]\name

  •   其中\\server 指定一个服务器的名字,如果是本机则用\\.表示,\\192.168.1.100表示网络上的服务器。
  •   \pipe 是一个不可变化的“硬编码”字串(不区分大小写),用于指出该文件从属于NPFS
  •   [\path]\name 则唯一标识一个命名管道的名称。

2、相关函数

    2.1 服务端函数

    2.1.1     CreateNamedPipe 创建命名管道

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/*************************************************************************
 Purpose :  创建命名管道,如果存在指定名字的管道,则创建该管道的一个实例
 Input   :  lpName              --  管道名称
            dwOpenMode          --  打开模式
            dwPipeMode          --  消息模式
            nMaxInstances       --  最大实例数(1-255)
            nOutBufferSize      --  输出缓冲区长度,0表示用默认设置
            nInBufferSize       --  输入缓冲区长度,0表示用默认设置
            nDefaultTimeOut     --  管道的默认超时时间(毫秒),0表示默认超时时间50毫秒
            lpSecurityAttributes--  安全描述符,如无特殊需求默认为0即可
 Return  :  成功 -- 返回管道句柄 失败 -- 返回INVALID_HANDLE_VALUE 通过GetLastError()获取错误代码
 Remark  : 
 *************************************************************************/
HANDLE WINAPI CreateNamedPipe(
  _In_      LPCTSTR lpName,
  _In_      DWORD dwOpenMode,
  _In_      DWORD dwPipeMode,
  _In_      DWORD nMaxInstances,
  _In_      DWORD nOutBufferSize,
  _In_      DWORD nInBufferSize,
  _In_      DWORD nDefaultTimeOut,
  _In_opt_  LPSECURITY_ATTRIBUTES lpSecurityAttributes
);

dwOpenMode 为下列常数组合

        常数之一:
  •     PIPE_ACCESS_DUPLEX 管道是双向的
  •     PIPE_ACCESS_INBOUND 数据从客户端流到服务器端
  •     PIPE_ACCESS_OUTBOUND 数据从服务器端流到客户端
        常数之二:
  •     FILE_FLAG_WRITE_THROUGH 在网络中建立的字节型管道内,强迫数据在每次读写操作的时候通过网络传输。否则传输会缓存导致延迟
  •     FILE_FLAG_OVERLAPPED 允许(但不要求)用这个管道进行异步(重叠式)操作

    dwPipeMode 为下列常数组合

        常数之一:

  •     PIPE_TYPE_BYTE             数据作为一个连续的字节数据流写入管道
  •     PIPE_TYPE_MESSAGE      数据用数据块(名为“消息”或“报文”)的形式写入管道    
        常数之二:
  •     PIPE_READMODE_BYTE 数据以单独字节的形式从管道中读出
  •      PIPE_READMODE_MESSAGE 数据以名为“消息”的数据块形式从管道中读出(要求指定PIPE_TYPE_MESSAGE)
        常数之三:
  •     PIPE_WAIT 同步操作在等待的时候挂起线程
  •     PIPE_NOWAIT 操作立即返回。这样可为异步传输提供一种落后的实现方法,已由Win32的重叠式传输机制取代了(不推荐!) 

    2.1.2     ConnectNamedPipe 等待客户连接

1
2
3
4
5
6
7
8
9
10
11
/*************************************************************************
 Purpose :  等待客户连接管道
 Input   :  hNamedPipe              --  创建管道的句柄,由CreateNamedPipe成功返回
            lpOverlapped            --  打开模式
 Return  :  TRUE -- 成功 FALSE -- 失败,通过GetLastError()获取错误码
 Remark  : 
 *************************************************************************/
 BOOL WINAPI ConnectNamedPipe(
  _In_         HANDLE hNamedPipe,
  _Inout_opt_  LPOVERLAPPED lpOverlapped
);

lpOverlapped 如设为NULL,表示将线程挂起,直到一个客户同管道连接为止。否则就立即返回;此时,如管道尚未连接,客户同管道连接时就会触发lpOverlapped结构中的事件对象。随后,可用一个等待函数来监视连接。


    2.2 客户端函数

    2.2.1     CreateFile 连接到一个命名管道

    2.2.2     WaitNamedPipe 等待管道实例是否可用

1
2
3
4
5
6
7
8
9
10
11
/*************************************************************************
 Purpose :  等待管道实例是否可用
 Input   :  lpNamedPipeName         --  管道名称
            nTimeOut                --  等待时间
 Return  :  TRUE -- 成功 FALSE -- 失败,通过GetLastError()获取错误码
 Remark  : 
 *************************************************************************/
BOOL WINAPI WaitNamedPipe(
  _In_  LPCTSTR lpNamedPipeName,
  _In_  DWORD nTimeOut
);

    2.3 管道收发数据函数

    2.3.1     ReadFile 从管道读出数据

    2.3.2     WriteFile 写数据到管道


    

 



Windows进程间通信--命名管道

标签:

原文地址:http://www.cnblogs.com/dspeeding/p/4427777.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!