首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Windows 進程間通訊:命名管道與郵槽完整實作指南

     編輯:關於C語言

前言

前文介紹剪貼板、匿名管道僅限本機且匿名管道需父子關係。命名管道與郵槽支援跨網路進程通訊,本文詳細實作雙方模型。

一、命名管道:可靠的雙向 C/S 通訊

特點

  • 建立於 Windows 檔案系統之上,使用標準 Win32 檔案 API(ReadFile/WriteFile)。
  • 伺服器建立管道實例,客戶端連接現有管道。
  • 支援位元組模式(流式)與訊息模式(保留邊界)。
  • 單管道實例一次僅服務一個客戶端,多客戶端需建立多實例。

伺服器端實作步驟

  1. 建立命名管道:CreateNamedPipe
    • 管道名格式:\\.\pipe\PipeName(本機)或 \\ServerName\pipe\PipeName(跨網路)。
    • 關鍵旗標:PIPE_ACCESS_DUPLEX(雙向)、FILE_FLAG_OVERLAPPED(非同步/重疊 I/O)。
    • nMaxInstances:最大實例數(如 1 或 PIPE_UNLIMITED_INSTANCES)。
  2. 等待客戶端連線:ConnectNamedPipe + OVERLAPPED 結構 + 事件物件(CreateEvent)實現非同步等待,WaitForSingleObject 阻塞直到連線到來。
  3. 讀寫資料:標準 ReadFile/WriteFile,緩衝區自管。

客戶端實作步驟

  1. 等待管道可用:WaitNamedPipe(可設超時)。
  2. 開啟管道:CreateFile 以 GENERIC_READ | GENERIC_WRITE 開啟管道名。
  3. 讀寫資料:同樣用 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);

二、郵槽:基於廣播的單向通訊

特點

  • 單向:伺服器唯讀,客戶端唯寫。
  • 廣播語意:一個客戶端寫入,所有讀取同名郵槽的伺服器皆可收到。
  • 資料量限制:單次訊息 < 424 位元組(Windows 限制)。
  • 適合簡單通知、狀態廣播、尋找服務等場景。

伺服器端

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、資料庫連線服務發現、狀態廣播、簡單通知

注意事項

  • 管道/郵槽名稱區分大小寫,建議統一小寫。
  • 非同步 I/O 需正確處理 OVERLAPPED 與事件,避免資源洩漏。
  • 跨網路時需注意防火牆、SMB 埠 (445) 開放、權限(管道安全描述元)。
  • 錯誤處理:檢查 GetLastError(),常見錯誤 ERROR_PIPE_BUSY、ERROR_NO_DATA 等。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved