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

Windows 2000 信使服務 DIY:打造跨防火牆的區域網路即時通訊小工具

     編輯:關於C++

前言:善用內建「信使服務」

Windows 2000 內建「信使服務」,原為系統管理員發送控制台訊息至用戶端設計。透過 net send 指令,我們可輕鬆開發一個輕量級區域網路即時通訊工具,且幾乎能穿透各類防火牆限制 (因使用 SMB/RPC 標準連接埠 139/445)。本文示範使用 C++Builder 5.0 快速建構 GUI 介面,呼叫 WinExec 執行 net send 實現訊息發送與廣播。

核心原理:net send 指令語法


NET SEND {name | * | /DOMAIN[:name] | /USERS} message
  • name:目標電腦名稱、IP 位址或使用者名稱
  • *:廣播給同網域/工作群組所有電腦
  • /DOMAIN:name:廣播給指定網域
  • /USERS:傳送給所有連接至伺服器的使用者
  • message:訊息內容 (支援多行)

開發環境與元件配置

  • IDE:C++Builder 5.0 / 6.0
  • 專案類型:VCL Forms Application
  • 表單元件:
    • Edit1:輸入目標 (電腦名/IP/*/domain:xxx)
    • Memo1:輸入訊息內容 (多行)
    • ButtonSend:發送按鈕
    • ButtonBroadcast:廣播按鈕 (選配)
    • Label:提示標籤

核心程式碼實作

發送按鈕 OnClick 事件


void __fastcall TForm1::BtnSendClick(TObject *Sender)
{
    AnsiString cmd = "NET SEND ";
    cmd += Edit1->Text.Trim();          // 目標
    cmd += " ";
    cmd += Memo1->Text;                 // 訊息內容

    // SW_HIDE 隱藏命令提示字元視窗
    WinExec(cmd.c_str(), SW_HIDE);
}

廣播按鈕 OnClick 事件 (選配)


void __fastcall TForm1::BtnBroadcastClick(TObject *Sender)
{
    AnsiString cmd = "NET SEND * ";
    cmd += Memo1->Text;
    WinExec(cmd.c_str(), SW_HIDE);
}

指定網域廣播


void __fastcall TForm1::BtnDomainBroadcastClick(TObject *Sender)
{
    AnsiString domain = "MYDOMAIN"; // 或從 Edit 輸入
    AnsiString cmd = "NET SEND /DOMAIN:" + domain + " " + Memo1->Text;
    WinExec(cmd.c_str(), SW_HIDE);
}

執行前提與限制

條件說明
作業系統僅支援 Windows 2000 / XP / Server 2003 (需啟用 Messenger 服務)。Vista/7/8/10/11 已移除此服務。
服務狀態接收端必須啟動「Messenger」服務 (services.msc → Messenger → 自動/啟動)。
防火牆需開放 TCP 139, 445 及 UDP 137, 138 (NetBIOS/SMB)。
權限發送者需具備目標電腦的訊息發送權限 (通常為 Domain Users 即可)。
編碼中文訊息建議確保主控台代碼頁 (chcp 950/65001) 與程式編碼一致,避免亂碼。

進階擴充建議

  • 訊息記錄:將發送/接收記錄寫入 SQLite 或文字檔。
  • 圖形化接收端:攔截 WM_COPYDATA 或掛鉤 MessageBox 自訂彈出視窗樣式。
  • 命令列參數化:支援命令列直接發送,整合至批次檔或排程任務。
  • 錯誤處理:改用 CreateProcess 取代 WinExec,可取得進程控制碼與退出碼判斷發送成敗。

程式碼改良版:使用 CreateProcess


bool SendNetMessage(const AnsiString& target, const AnsiString& msg)
{
    AnsiString cmd = "cmd.exe /c NET SEND " + target + " " + msg;
    STARTUPINFOA si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;

    if (!CreateProcessA(NULL, cmd.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
        return false;

    WaitForSingleObject(pi.hProcess, 5000); // 等待 5 秒
    DWORD exitCode = 0;
    GetExitCodeProcess(pi.hProcess, &exitCode);
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    return exitCode == 0;
}

總結

利用 Windows 2000 內建信使服務與 net send,我們以極少程式碼快速實作一個實用的區域網路通訊小工具。雖然現代 Windows 版本已移除此功能,但在維護舊系統、嵌入式裝置或隔離網路環境時,此技巧仍具參考價值。理解其背後的 SMB/RPC 通訊機制,也有助於掌握 Windows 網路程式設計基礎。

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