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

C# 調用 Windows 信使服務實現局域網即時通訊

     編輯:關於C語言

前言:信使服務的優勢與局限

Windows 信使服務 從 Windows 2000 起內建且默認啟動,無需額外安裝客戶端,僅需雙方開啟服務即可發送文本消息,極適合簡單局域網通知場景。但僅支持純文本,無法傳輸文件/二進制數據,且依賴 NetBIOS over TCP/IP,現代網絡環境 (防火牆、跨網段、IPv6) 可能受限。本文演示 C# P/Invoke 調用 `NetMessageBufferSend` 實現發送功能。

核心 API 聲明


using System.Runtime.InteropServices;

public static class MessengerInterop
{
    /// 
    /// 發送信使消息
    /// 
    /// 服務器名,NULL 表示本地
    /// 接收者別名 (計算機名/用戶名/IP)
    /// 發送者名,NULL 表示匿名
    /// 消息內容指針
    /// 消息字節長度
    /// 0 成功,非 0 為系統錯誤碼
    [DllImport("netapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern int NetMessageBufferSend(
        string serverName,
        string msgName,
        string fromName,
        byte[] buf,
        int bufLen);
}

WinForms 發送器實現

界面設計

  • `TextBox txtTarget`:目標 IP/計算機名/用戶名
  • `TextBox txtMessage` (Multiline=true):消息內容
  • `Button btnSend`:發送按鈕

發送邏輯


private void btnSend_Click(object sender, EventArgs e)
{
    string target = txtTarget.Text.Trim();
    string message = txtMessage.Text;
    
    if (string.IsNullOrEmpty(target) || string.IsNullOrEmpty(message))
    {
        MessageBox.Show("目標和消息不能為空");
        return;
    }

    try
    {
        // Unicode 編碼:每字符 2 字節,結尾雙 null 終止符 (+2)
        byte[] buffer = Encoding.Unicode.GetBytes(message);
        int byteLen = buffer.Length + 2; // API 要求包含結束符長度

        int result = MessengerInterop.NetMessageBufferSend(
            null,       // 本地發送
            target,     // 接收者
            null,       // 匿名發送
            buffer,
            byteLen);

        if (result == 0)
            MessageBox.Show("發送成功!");
        else
            MessageBox.Show($"發送失敗,錯誤碼: {result} (參考 WinError.h)");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"異常: {ex.Message}");
    }
}

關鍵技術細節

參數說明

參數說明典型值
serverName發送方服務器,NULL 為本機`null`
msgName接收者別名:計算機名、用戶名、IP 地址、域名`"PC-NAME"` / `"192.168.1.100"`
fromName發送者顯示名,NULL 為匿名`null` / `"Admin"`
buf消息內容字節數組 (Unicode)`Encoding.Unicode.GetBytes(msg)`
bufLen字節長度,必須包含結束符 (Unicode 為 +2 字節)`buffer.Length + 2`

常見錯誤碼

  • `0` : 成功
  • `5` (ERROR_ACCESS_DENIED) : 權限不足,需管理員權限或目標未開啟信使服務
  • `234` (ERROR_MORE_DATA) : 消息過長 (限制約 128KB)
  • `1722` (RPC_S_SERVER_UNAVAILABLE) : RPC 服務不可用,網絡不通或目標服務未啟動
  • `1723` (RPC_S_PROTOCOL_ERROR) : 協議錯誤

前置條件檢查清單

  1. 目標機器運行 Windows 2000 / XP / 2003 / Vista / 7 / 8 / 10 / Server 等
  2. 服務「Messenger」 (顯示名「信使」) 狀態為「已啟動」
    `services.msc` → Messenger → 啟動類型:自動/手動 → 啟動
  3. 網絡互通 (Ping 通),NetBIOS over TCP/IP 已啟用 (網卡屬性 → IPv4 → 進階 → WINS → 啟用 NetBIOS)
  4. 防火牆允許 RPC 動態端口 (135, 445 及高端口範圍) 或關閉防火牆測試
  5. 發送方程序建議以管理員權限運行

現代替代方案對比

方案優點缺點適用場景
信使服務零部署、系統內建、API 簡單僅文本、NetBIOS 依賴、跨網段困難、安全性低、已棄用 (Win10 1709+ 移除)極簡舊環境維護
Socket/TcpListener全雙工、二進制、跨平台、可控需雙方部署客戶端/服務端即時通訊、文件傳輸
SignalR / WebSocketWeb 標準、穿透防火牆、自動重連、擴展性強需服務端、較重Web/移動端即時推送
命名管道本機/局域網高性能、安全、支持模擬僅 Windows、需服務端進程間通信、服務通信
MSMQ / RabbitMQ可靠隊列、持久化、解耦基礎設施重異步任務、微服務

總結

C# 通過 P/Invoke `netapi32.dll!NetMessageBufferSend` 可輕松調用 Windows 信使服務發送局域網文本消息。關鍵在於:Unicode 編碼 + 長度含結束符 + 目標別名準確 + 服務啟動 + 網絡/防火牆通暢。鑒於信使服務在現代 Windows 版本中已移除且安全性存疑,新項目強烈建議採用 Socket/SignalR/命名管道等現代通信技術。本技術僅適用於維護極老舊系統 (Win2000/XP/2003 環境) 的臨時方案。

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