前文介紹剪貼簿與匿名管道(僅限本機、且需父子關係)。本文介紹支援跨網路的兩種 IPC 機制:命名管道(雙向、可靠、連線導向)與信箱槽(單向、廣播、資料包導向)。均以 Win32 API 示範。
\\.\pipe\PipeName(本機);\\ServerIP\pipe\PipeName(跨網路)。ReadFile 一次讀一則完整訊息。PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED(雙向 + 非同步)PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT(訊息模式)nMaxInstances:最大實例數(每用戶端一實例)CreateEvent 事件物件,綁定 OVERLAPPED.hEvent,呼叫 ConnectNamedPipe,再 WaitForSingleObject 等待事件觸發。ReadFile/WriteFile 收發資料。DisconnectNamedPipe,迴圈等待下一用戶端。GENERIC_READ | GENERIC_WRITE)。ReadFile/WriteFile 通訊。CloseHandle。HANDLE hPipe = CreateNamedPipe(
L"\\\\.\\pipe\\MyPipe",
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
5, 1024, 1024, 0, NULL);
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
OVERLAPPED ol = {0};
ol.hEvent = hEvent;
ConnectNamedPipe(hPipe, &ol);
WaitForSingleObject(hEvent, INFINITE); /* 等待用戶端連線 */
CloseHandle(hEvent);
CreateFile 直接開啟寫入。HANDLE hSlot = CreateMailslot(
L"\\\\.\\mailslot\\MySlot", 0, MAILSLOT_WAIT_FOREVER, NULL);
char buf[200]; DWORD cbRead;
ReadFile(hSlot, buf, sizeof(buf), &cbRead, NULL); /* 封鎖直到有訊息 */
printf("Received: %.*s\n", cbRead, buf);
CloseHandle(hSlot);
HANDLE hSlot = CreateFile(
L"\\\\.\\mailslot\\MySlot",
GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
char msg[] = "Hello from client!";
DWORD cbWritten;
WriteFile(hSlot, msg, strlen(msg)+1, &cbWritten, NULL);
CloseHandle(hSlot);
| 需求 | 推薦機制 |
|---|---|
| 雙向、可靠、大量資料、跨網路 | 命名管道 |
| 單向、廣播、小封包、簡單通知 | 信箱槽 |
| 本機高效能、共享記憶體 | 記憶體對應檔 |
| 本機、父子進程、單向 | 匿名管道 |