IPC處理序間通訊+管道Pipe IPC(Inter-Process Communication,處理序間通訊)。 管道用於進程間共用資料,其實質是共用記憶體,常用IPC之一。管道不僅可以用於本機處理序間通訊,還可實現跨網路處理序間通訊,如同Socket通訊,管道同樣封裝電腦底層網路實現,提供一個良好的API介面。 1.管道(Pipe):
管道分為匿名管道和具名管道。 匿名管道只能用於父子處理序間通訊 ,不能跨網路通訊,並且通訊是單向。 具名管道可用於任意處理序間通訊,支援跨網路通訊,並且通訊是雙向,任意一段都可以接收和發送資料。具名管道是學習的重點。 具名管道通訊進程分為服務端和用戶端,服務端建立Pipe,用戶端通過管道名串連該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 // 安全屬性指標);
該函數用於伺服器端建立具名管道。等待用戶端串連: BOOL ConnectNamedPipe(
HANDLE hNamedPipe, //管道控制代碼
LPOVERLAPPED lpOverlapped //設為NULL
);
該函數用於伺服器等待用戶端串連到管道。檢查具名管道: BOOL WaitNamedPipe(
LPCTSTR lpNamedPipeName, //管道名
DWORD nTimeOut //逾時
); 該函數用於用戶端檢查是否存在管道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。 該函數用於用戶端向管道寫入資料。
4.牛刀小試 : 先在VC6.0中運行服務端程式,在運行用戶端程式。
運行效果:
伺服器程式:用戶端程式: