大型系統常拆分為多個協同進程,可能跨機器、跨語言。本文聚焦同機器或區域網路下的 C++/CLI TCP Socket 通訊,示範「伺服器接收兩整數、回傳加總」的完整流程。
IPEndPoint::MinPort/MaxPort)。Dns::GetHostEntry),建立 IPEndPoint。Socket(AddressFamily::InterNetwork, Stream, Tcp)。Bind、Listen(1) 進入阻塞等待。Accept() 取得連線專用 Socket,關閉監聽 Socket。NetworkStream、BinaryReader/Writer 進行二進位收發。ReadInt32 兩次、計算、Write 回傳,直到 EndOfStreamException 或 IOException。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)提升並發。SslStream)保護資料機密性。