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

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

     編輯:關於C

前言

前文介紹剪貼簿與匿名管道(僅限本機、且需父子關係)。本文介紹支援跨網路的兩種 IPC 機制:命名管道(雙向、可靠、連線導向)與信箱槽(單向、廣播、資料包導向)。均以 Win32 API 示範。

一、命名管道

架構模型

  • 伺服器:建立管道實例、等待連線、讀寫資料。
  • 用戶端:連線現有管道、讀寫資料。
  • 命名格式:\\.\pipe\PipeName(本機);\\ServerIP\pipe\PipeName(跨網路)。
  • 兩種模式:
      • 位元組模式:串流,無訊息邊界。
      • 訊息模式:保留訊息邊界,ReadFile 一次讀一則完整訊息。

伺服器端流程

  1. CreateNamedPipe 建立實例,回傳控制代碼。關鍵參數:
      PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED(雙向 + 非同步)
      PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT(訊息模式)
      nMaxInstances:最大實例數(每用戶端一實例)
  2. ConnectNamedPipe + Overlapped I/O 非同步等待連線。
      建立 CreateEvent 事件物件,綁定 OVERLAPPED.hEvent,呼叫 ConnectNamedPipe,再 WaitForSingleObject 等待事件觸發。
  3. 連線成功後,用標準 ReadFile/WriteFile 收發資料。
  4. 斷線後 DisconnectNamedPipe,迴圈等待下一用戶端。

用戶端流程

  1. WaitNamedPipe 等待管道實例可用(可設超時)。
  2. CreateFile 開啟管道(GENERIC_READ | GENERIC_WRITE)。
  3. ReadFile/WriteFile 通訊。
  4. 結束 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);

二、信箱槽

特性

  • 單向:伺服器唯讀,用戶端唯寫。
  • 廣播:一個用戶端寫入,所有讀取該槽的伺服器皆收到。
  • 資料包導向:保留訊息邊界,單則訊息 < 424 bytes(Windows 限制)。
  • 無連線建立過程,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);

選擇指南

需求推薦機制
雙向、可靠、大量資料、跨網路命名管道
單向、廣播、小封包、簡單通知信箱槽
本機高效能、共享記憶體記憶體對應檔
本機、父子進程、單向匿名管道
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved