【IPC进程间通讯之二】管道Pipe

时间:2024-04-18 13:03:43

IPC进程间通信+管道Pipe

        IPC(Inter-Process Communication。进程间通信)。

        管道用于进程间共享数据,事实上质是共享内存。经常使用IPC之中的一个。

管道不仅能够用于本机进程间通信,还可实现跨网络进程间通信。如同Socket通信。管道相同封装计算机底层网络实现,提供一个良好的API接口。

       
       1.管道(Pipe):


       管道分为匿名管道和命名管道。
       匿名管道仅仅能用于父子进程间通信 ,不能跨网络通信,而且通信是单向。

       命名管道可用于随意进程间通信。支持跨网络通信,而且通信是双向。随意一段都能够接收和发送数据。

命名管道是学习的重点。

       命名管道通信进程分为服务端和client,服务端创建Pipe,client通过管道名连接该Pipe之后。两方均可通过该Pipe发送和接收数据。
       
        2.邮槽命名 :
       本机上格式:\\ServerName\Pipe\name
       如:\\.\Pipe\my_pipe


       3.基本API函数 :
创建命名管道:
        HANDLE    CreateNamedPipe(

                        LPCTSTR   lpName,                // 指向管道名称的指针

                        DWORD     dwOpenMode,       // 管道打开模式

                        DWORD     dwPipeMode,
      // 管道模式

                        DWORD     nMaxInstances,     // 最大实例数

                        DWORD     nOutBufferSize,   // 输出缓存大小

                        DWORD     nInBufferSize,       // 输入缓存大小

                        DWORD    nDefaultTimeOut, // 超时设置

LPSECURITY_ATTRIBUTES lpSecurityAttributes   // 安全属性指针
);
        该函数用于server端创建命名管道。
等待client连接:
        BOOL  ConnectNamedPipe(

                     HANDLE    hNamedPipe,        //管道句柄

                     LPOVERLAPPED   lpOverlapped     //设为NULL

); 

        该函数用于server等待client连接到管道。

检查命名管道:
        BOOL  WaitNamedPipe(

                     LPCTSTR   lpNamedPipeName,  //管道名

                     DWORD     nTimeOut                  //超时

);
         该函数用于client检查是否存在管道Pipe。

打开命名管道:
        BOOL  CreateFile(
                     LPCTSTR   lpFileName,

                     DWORD     dwDesiredAccess,

                     DWORD     dwShareMode,

                     LPSECURITY_ATTRIBUTES   lpSecurityAttributes,

                     DWORD    dwCreationDisposition,

                     DWORD    dwFlagsAndAttributes,

                    HANDLE    hTemplateFile
);
         第一个參数:管道名指针。
         第二个參数:訪问模式。
         第三个參数:共享模式。
         第四个參数:安全属性指针。

         第五个參数:创建选项。
         第六个參数:文件属性。
         第七个參数:用于拷贝文件句柄。
         该函数用于打开一个管道。并返回管道句柄。
读取管道:       

BOOL ReadFile(

                    HANDLE    hFile,

                    LPVOID     lpBuffer,

                    DWORD    nNumberOfBytesToRead,

                    LPDOWRD    lpNumberOfBytesRead,

                    LPOVERLAPPED   lpOverlapped);

        第一个參数:管道句柄。
        第二个參数:缓存地址。

        第三个參数:消息的长度。
        第四个參数:实际读取的长度。

        第五个參数:一般设置为NULL。
        该函数用于读取管道内数据。
写入管道:
        BOOL  WriteFile(

                     HANDLE    hFile,

                     LPCVOID   lpBuffer,

                     DWORD     nNumberOfBytesToWrite,

                     LPDWORD   lpNumberOfBytesWritten,

                     LPOVERLAPPED    lpOverlapped);
         第一个參数:管道句柄。

         第二个參数:数据缓冲区指针。
         第三个參数:写入字节数。
         第四个參数:返回实际写入字节数。
         第五个參数:结构体指针。一般置NULL。

         该函数用于client向管道写入数据。


         4.牛刀小试 : 
         先在VC6.0中执行服务端程序。在执行client程序。
【IPC进程间通讯之二】管道Pipe
         执行效果:
【IPC进程间通讯之二】管道Pipe

server程序:
client程序: