我剛開始使用 C# 使用 .net 進行套接字編程,我有一個關于我在我的機器上構建的實驗服務器和客戶端的問題。
我的任務是讓客戶端通過埠 2004 與服務器通信,服務器通過埠 2010 與客戶端通信。這意味著服務器在埠 2004 中接收訊息,并在埠 2010 中發送它們。但是我正在努力實作這一點. 例如,這是否意味著服務器具有 2004 的本地端點和 2010 的遠程端點?或者我應該為此制作2個不同的插座?現在我的代碼如下所示:
客戶
Socket sock;
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint clientEndpoint = new IPEndPoint(ipAddress, 2010);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 2004);
EndPoint remoteEP = (EndPoint)sender;
sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sock.Bind(clientEndpoint);
服務器
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint remoteEndpoint = new IPEndPoint(IPAddress.Any, 2010);
remoteEP = (EndPoint)remoteEndpoint;
IPEndPoint localEndpoint = new IPEndPoint(ipAddress, 2004);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(localEndpoint);
我試過在 Stackoverflow 上探查其他問題,還閱讀了 learn.microsoft.com 上的 Socket 檔案,但我真的不知道該怎么做。我還想知道在這種情況下我將如何使用 ReceiveFrom 和 SendTo,但我假設我只是接收并發送到遠程端點?
uj5u.com熱心網友回復:
我在現實生活中從來不需要使用套接字,所以這主要基于協議和檔案的基本知識。
UDP 是一種單向協議,因此如果您想要雙向通信,您將在每臺計算機(或同一臺計算機上的程式)上設定服務器和客戶端,所以是的,您需要兩個不同的套接字。通過套接字示例,服務器應該類似于:
using Socket listener = new(
AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
listener.Bind(localEndpoint);
listener.Listen(100);
var handler = await listener.AcceptAsync();
while (true)
{
// Receive message.
var buffer = new byte[1_024];
var receivedNoBytes = await handler.ReceiveAsync(buffer, SocketFlags.None);
var receivedString = Encoding.UTF8.GetString(buffer, 0, receivedNoBytes );
Console.WriteLine(receivedString);
}
和客戶:
using Socket client = new(
AddressFamily.InterNetwork,
SocketType.Dgram,
ProtocolType.Udp);
await client.ConnectAsync(remoteEndpoint);
while (true)
{
// Send message.
var message = Console.ReadLine();;
var messageBytes = Encoding.UTF8.GetBytes(message);
_ = await client.SendAsync(messageBytes, SocketFlags.None);
}
在一臺“計算機”上,您將使用 2004 作為 localEndpoint 埠,并在另一臺“計算機”上作為 remoteEndpoint。因此,您可能希望將偵聽埠和遠程埠作為命令列引數,這樣您就可以為兩者運行相同的程式實體。
注意 thelistener和clientrun 在單獨的無限回圈中。因此,單個執行緒可以接收或發送資料,而不是兩者。如果您想同時發送和接收,您可以在單獨的執行緒上運行每個。另一種選擇是在單個執行緒上交錯發送接收,但這樣您需要等待回應才能發送下一條訊息。所以我會使用雙執行緒解決方案,但無論何時使用多執行緒,你都應該對執行緒安全有所了解。
另請注意,原始 UDP 沒有“訊息”的真正概念。如果你想要更多的資料,你需要創建自己的協議來定義訊息的開始和結束,以及錯誤處理等。更高級別的協議會為你處理這個,并且通常更容易使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520780.html
下一篇:套接字僅接收46位元組的資料
