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);
第一個參數:管道句柄。
先在VC6.0中執行服務端程序,在執行client程序。
執行效果:
server程序:
版權聲明:本文博主原創文章。博客,未經贊成不得轉載。緩存