it-swarm.com.de

Einfaches UDP-Beispiel zum Senden und Empfangen von Daten von demselben Socket

Aus irgendeinem Grund fällt es mir schwer, Daten über denselben Socket zu senden und zu empfangen. Sowieso ist hier mein Klientencode:

var client = new UdpClient();
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000); // endpoint where server is listening (testing localy)
client.Connect(ep); 

// send data
client.Send(new byte[] { 1, 2, 3, 4, 5 }, 5);

// then receive data
var receivedData = client.Receive(ref ep);  // Exception: An existing connection was forcibly closed by the remote Host

Grundsätzlich möchte ich ein Protokoll erstellen, in dem ich ein udp-Paket sende und dann eine Antwort erwarte. Genau wie beim HTTP-Protokoll gibt es für jede Anforderung eine Antwort. Dieser Code funktioniert, wenn sich der Server auf einem anderen Server befindet Computer. Es kann jedoch vorkommen, dass sich Server und Client auf demselben Computer befinden.

Hier ist der Server:

UdpClient udpServer = new UdpClient(UDP_LISTEN_PORT);

while (true)
{
    var groupEP = new IPEndPoint(IPAddress.Any, 11000); // listen on any port
    var data = udpServer.Receive(ref groupEP);
    udpServer.Send(new byte[] { 1 }, 1); // if data is received reply letting the client know that we got his data          
}

Bearbeiten

der Grund, warum ich tcp nicht verwenden kann, ist, dass sich der Client manchmal hinter einem NAT (Router) befindet und es einfacher ist, UDP-Lücken zu lochen als TCP.


Lösung:

dank markmnl antwort hier ist mein code:

Server:

UdpClient udpServer = new UdpClient(11000);

while (true)
{
    var remoteEP = new IPEndPoint(IPAddress.Any, 11000); 
    var data = udpServer.Receive(ref remoteEP); // listen on port 11000
    Console.Write("receive data from " + remoteEP.ToString());
    udpServer.Send(new byte[] { 1 }, 1, remoteEP); // reply back
}

Kundencode:

var client = new UdpClient();
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000); // endpoint where server is listening
client.Connect(ep);

// send data
client.Send(new byte[] { 1, 2, 3, 4, 5 }, 5);

// then receive data
var receivedData = client.Receive(ref ep);

Console.Write("receive data from " + ep.ToString());

Console.Read();
39
Tono Nam

(Ich nehme an, Sie sind sich dessen bewusst, dass die Verwendung von UDP (User Datagram Protocol) keine Zustellung garantiert, keine Überprüfung auf Duplikate und keine Überlastungskontrolle durchführt und lediglich Ihre Frage beantwortet.).

In Ihrem Server diese Zeile:

var data = udpServer.Receive(ref groupEP);

weist groupEP von dem, was Sie hatten, der Adresse zu, unter der Sie etwas erhalten haben.

Diese Linie:

udpServer.Send(new byte[] { 1 }, 1); 

Funktioniert nicht, da Sie nicht angegeben haben, an wen die Daten gesendet werden sollen. (Es funktioniert auf Ihrem Client, weil Sie connect angerufen haben, was bedeutet, dass send immer an den Endpunkt gesendet wird, mit dem Sie verbunden sind. Natürlich möchten wir das nicht auf dem Server, da wir viele Clients haben könnten.) Ich würde:

UdpClient udpServer = new UdpClient(UDP_LISTEN_PORT);

while (true)
{
    var remoteEP = new IPEndPoint(IPAddress.Any, 11000);
    var data = udpServer.Receive(ref remoteEP);
    udpServer.Send(new byte[] { 1 }, 1, remoteEP); // if data is received reply letting the client know that we got his data          
}

Wenn Sie Server und Client auf demselben Computer haben, sollten Sie sie auch an verschiedenen Ports haben.

25
markmnl

Ich werde versuchen, dies kurz zu halten. Ich habe this vor ein paar Monaten für ein Spiel, das ich bauen wollte, versucht, eine UDP "Client-Server" -Verbindung herzustellen, die sich wie TCP verhält, Sie kann damit senden (Nachricht) (Nachricht + Objekt). Ich habe ein paar Tests damit durchgeführt und es funktioniert einwandfrei. Sie können es jederzeit ändern, falls erforderlich.

2
Creţu Cosmin