前文介紹剪貼板、匿名管道僅限本機且匿名管道需父子關係。命名管道與郵槽支援跨網路進程通訊,本文詳細實作雙方模型。
ReadFile/WriteFile)。CreateNamedPipe
\\.\pipe\PipeName(本機)或 \\ServerName\pipe\PipeName(跨網路)。PIPE_ACCESS_DUPLEX(雙向)、FILE_FLAG_OVERLAPPED(非同步/重疊 I/O)。nMaxInstances:最大實例數(如 1 或 PIPE_UNLIMITED_INSTANCES)。ConnectNamedPipe + OVERLAPPED 結構 + 事件物件(CreateEvent)實現非同步等待,WaitForSingleObject 阻塞直到連線到來。ReadFile/WriteFile,緩衝區自管。WaitNamedPipe(可設超時)。CreateFile 以 GENERIC_READ | GENERIC_WRITE 開啟管道名。ReadFile/WriteFile。HANDLE hPipe = CreateNamedPipe(
"\\\\.\\pipe\\MyPipe",
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
0, 1, 1024, 1024, 0, NULL);
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
OVERLAPPED olp = {0};
olp.hEvent = hEvent;
ConnectNamedPipe(hPipe, &olp);
WaitForSingleObject(hEvent, INFINITE);
CloseHandle(hEvent);
HANDLE hMailslot = CreateMailslot(
"\\\\.\\mailslot\\MyMailslot", 0, MAILSLOT_WAIT_FOREVER, NULL);
DWORD dwRead; char buf[200];
ReadFile(hMailslot, buf, 200, &dwRead, NULL); // 阻塞直到有資料
CloseHandle(hMailslot);
HANDLE hMailslot = CreateFile(
"\\\\.\\mailslot\\MyMailslot",
GENERIC_WRITE, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
char buf[] = "使用郵槽進行進程間通訊";
DWORD dwWrite;
WriteFile(hMailslot, buf, strlen(buf)+1, &dwWrite, 0);
CloseHandle(hMailslot);
郵槽本身單向,若需雙向:客戶端與伺服器各自建立一個郵槽(名稱不同),雙方同時扮演讀寫角色。
| 特性 | 命名管道 | 郵槽 |
|---|---|---|
| 通訊模式 | 雙向、可靠、連線導向 | 單向、廣播、資料報式 |
| 跨網路 | 支援 | 支援 |
| 資料量 | 無實際上限(受緩衝區限制) | 單次 < 424 位元組 |
| API 風格 | 檔案 I/O (ReadFile/WriteFile) | 檔案 I/O (ReadFile/WriteFile) |
| 典型用途 | 資料流傳輸、RPC、資料庫連線 | 服務發現、狀態廣播、簡單通知 |
OVERLAPPED 與事件,避免資源洩漏。GetLastError(),常見錯誤 ERROR_PIPE_BUSY、ERROR_NO_DATA 等。