【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程序:
相關文章
相關標籤/搜索