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

C++/CLI 進程間通訊實戰:Socket 伺服器與用戶端模型

     編輯:VC 教學

背景

大型系統常拆分為多個協同進程,可能跨機器、跨語言。本文聚焦同機器或區域網路下的 C++/CLI TCP Socket 通訊,示範「伺服器接收兩整數、回傳加總」的完整流程。

伺服器端核心步驟

  1. 解析命令列參數取得連接埠,驗證範圍(IPEndPoint::MinPort/MaxPort)。
  2. 取得本機 IP(Dns::GetHostEntry),建立 IPEndPoint。
  3. 建立 Socket(AddressFamily::InterNetwork, Stream, Tcp)。
  4. Bind、Listen(1) 進入阻塞等待。
  5. Accept() 取得連線專用 Socket,關閉監聽 Socket。
  6. 包裝 NetworkStream、BinaryReader/Writer 進行二進位收發。
  7. 迴圈 ReadInt32 兩次、計算、Write 回傳,直到 EndOfStreamException 或 IOException。
  8. 正確關閉:Shutdown(Both)、Close()、資料流關閉。

完整伺服器程式碼

using namespace System;
using namespace System::IO;
using namespace System::Net;
using namespace System::Net::Sockets;

int main(array^ argv)
{
    if (argv->Length != 1) {
        Console::WriteLine("Usage: Server port");
        Environment::Exit(1);
    }
    int port = 0;
    try { port = Int32::Parse(argv[0]); }
    catch (FormatException^) {
        Console::WriteLine("Port number {0} is ill-formed", argv[0]);
        Environment::Exit(2);
    }
    if (port < IPEndPoint::MinPort || port > IPEndPoint::MaxPort) {
        Console::WriteLine("Port number must be in the range {0}-{1}", IPEndPoint::MinPort, IPEndPoint::MaxPort);
        Environment::Exit(3);
    }

    IPAddress^ ipAddress = Dns::GetHostEntry(Dns::GetHostName())->AddressList[0];
    IPEndPoint^ ipEndpoint = gcnew IPEndPoint(ipAddress, port);

    Socket^ listenerSocket = gcnew Socket(AddressFamily::InterNetwork, SocketType::Stream, ProtocolType::Tcp);
    listenerSocket->Bind(ipEndpoint);
    listenerSocket->Listen(1);
    Console::WriteLine("Server listener blocking status is {0}", listenerSocket->Blocking);

    Socket^ serverSocket = listenerSocket->Accept();
    Console::WriteLine("New connection accepted");
    listenerSocket->Close();

    NetworkStream^ netStream = gcnew NetworkStream(serverSocket);
    BinaryReader^ br = gcnew BinaryReader(netStream);
    BinaryWriter^ bw = gcnew BinaryWriter(netStream);

    try {
        while (true) {
            int value1 = br->ReadInt32();
            int value2 = br->ReadInt32();
            Console::Write("Received values {0,3} and {1,3}", value1, value2);
            int result = value1 + value2;
            bw->Write(result);
            Console::WriteLine(", sent result {0,3}", result);
        }
    }
    catch (EndOfStreamException^) { }
    catch (IOException^ e) { Console::WriteLine("IOException {0}", e); }

    serverSocket->Shutdown(SocketShutdown::Both);
    serverSocket->Close();
    netStream->Close();
    Console::WriteLine("Shutting down server");
}

用戶端大綱(對稱操作)

  • 建立 Socket,Connect(ipEndpoint)。
  • 包裝 NetworkStream、BinaryWriter/Reader。
  • 迴圈寫入兩整數、ReadInt32 讀取結果。
  • 例外處理與資源釋放同上。

生產環境強化建議

  • 使用 TcpListener/TcpClient 高階 API 簡化程式碼。
  • 加入長度前綴或訊息框架,避免黏包/拆包。
  • 採用非同步 BeginAccept/EndAccept 或 async/await(C++/CLI 支援 Task)提升並發。
  • 啟用 SSL/TLS(SslStream)保護資料機密性。
  • 序列化改用 Protocol Buffers、MessagePack 或 JSON 以利跨語言。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved