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 //超時
);
打開命名管道:
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);
第二個參數:數據緩衝區指針。
先在VC6.0中執行服務端程序。在執行client程序。
執行效果:
server程序: