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

C# NamedPipe 進程間通訊實戰 (一) - 伺服器端主控台實作

     編輯:關於C語言

命名管道 是 Windows 核心提供的高效進程間通訊 (IPC) 機制,支援本機與跨網路通訊。本文基於 CodeProject 開源封裝 (AppModule.NamedPipes),快速建立伺服器端主控台程式。

核心組件來源

CodeProject: .NET Named Pipes Part 1 提供兩個組件:

  • AppModule.InterProcessComm:定義 IInterProcessConnection、ServerPipeConnection、ClientPipeConnection 介面與基類。
  • AppModule.NamedPipes:具體 Named Pipe 實作 (P/Invoke CreateNamedPipe/ConnectNamedPipe 等)。

伺服器端完整程式碼


using System;
using System.Threading;
using AppModule.InterProcessComm;
using AppModule.NamedPipes;

namespace Server
{
    class Program
    {
        static void Main(string[] args)
        {
            // 管道名稱、輸入/輸出緩衝區大小、逾時(ms)、非同步旗標
            var server = new ServerPipeConnection("np-test-by-jinjazz", 512, 512, 5000, false);
            Console.WriteLine("等待客戶端連線...");

            while (true)
            {
                try
                {
                    server.Disconnect(); // 斷開上一個客戶端
                    server.Connect();    // 等待新連線 (阻塞)

                    string request = server.Read();
                    if (!string.IsNullOrEmpty(request))
                    {
                        Console.WriteLine($"收到: {request}");
                        server.Write($"Echo: {request}");

                        if (request.ToLower() == "break") break;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"錯誤: {ex.Message}");
                    break;
                }
            }

            server.Dispose();
            Console.WriteLine("按任意鍵結束...");
            Console.ReadKey();
        }
    }
}

關鍵流程解析

  1. 建立伺服器實例:管道名稱全系統唯一,緩衝區 512 bytes 足夠一般指令。
  2. 迴圈等待連線:Connect() 阻塞直到客戶端呼叫 ClientPipeConnection.Connect()。
  3. 讀取/寫入:Read() 封裝 ReadFile,Write() 封裝 WriteFile,均為同步阻塞。
  4. 斷開重聽:Disconnect() 對應 DisconnectNamedPipe,釋放當前實例準備下一輪。
  5. 優雅關閉:收到 "break" 指令跳出迴圈,呼叫 Dispose() 關閉管道控制代碼。

測試步驟

  1. 編譯 AppModule.InterProcessComm、AppModule.NamedPipes 兩個 DLL。
  2. 建立主控台專案 Server 參考上述 DLL,貼上程式碼並執行。
  3. 建立第二個主控台/WinForms/ASP.NET 專案參考 DLL,使用 ClientPipeConnection 連線測試 (見下篇)。

適用場景與限制

優點缺點/限制
高效能、低延遲 (核心模式傳輸)僅限 Windows 平台
支援跨網路 (SMB/445 port)需開放防火牆、受網路延遲影響
內建同步機制 (Connect/Disconnect)單連線模式;高併發需自行實作連線池/多執行緒
可設定 ACL 存取控制大訊息需自行分片 (緩衝區限制)

.NET Core 3.0+ 內建 System.IO.Pipes.NamedPipeServerStream/ClientStream,新專案建議直接使用 BCL 實現,無需第三方組件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved