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

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程序。


          执行效果:

server程序:
client程序:




版权声明:本文博主原创文章。博客,未经赞成不得转载。缓存

相关文章
相关标签/搜索