Frage

Für meine Uni Zuweisung ich eine schnelle Aktion zu schaffen haben paced vernetzten Spiel und haben so gewählt UDP zu verwenden, wie TCP gegenüber. Ich kenne viele der Unterschiede sowohl UDP und TCP in der Programmierung und haben durch die meisten der relevanten Teile der MSDN-Dokumentation auf winsock lesen. Auf MSDN heißt es, dass über die Funktion connect () einen UDP-Socket zu schaffen sollte die Buchse mit der Adresse und dem Port spezifizierte, und als Ergebnis zu können, verwenden, um die send () und recv () -Funktionen mit der Buchse geschaffen binden.

Für meine Anwendung erstelle ich einen Client und verwende connect () mit der Loopback-Adresse, die eine Anzahl von Paketen über die send () Funktion sendet. Der Kunde, nach dem Aufruf von select (), empfängt dann die Pakete, die er verschickt. (Aber das Ergebnis, das ich von der recv bekommen) -Funktion ist SOCKET_ERROR und die Fehlerbeschreibung mit WSAGetLastError () wird „eine vorhandene Verbindung wurde von dem Remotehost geschlossen wurde“.

Wenn ich die bind () Funktion verwenden und die Verwendung sendto () Daten über die Loopback-Adresse zu schicken, ich recv () Pakete ohne Fehler ... Wer weiß, warum die Funktion connect () tut, ist nicht das, was es ist tun sollte, und hat jemand in der Lage UDP-Sockets mit der Funktion connect () zu benutzen?

War es hilfreich?

Lösung

Sie müssen rufen bind (), wenn Sie Ihr Programm wollen UDP-Pakete zu empfangen. connect () setzt nur die Adresse, dass die Socket-Pakete senden, wenn Sie rufen Sie send (); es nicht assoziieren die Buchse mit einem lokalen UDP-Port zu empfangen, auf; für die Sie anrufen binden müssen ().

Andere Tipps

„UNIX Network Programming“ weist darauf hin, dass ein Verbindungs ??callte auf einer UDP-Client-Seite Socket-Figuren aus und speichert alle den Zustand über die Ziel Socket-Adresse im Voraus (Maskierung, die Auswahl-Schnittstelle, etc.), spart die Kosten der so auf jedem :: sendto Anruf. Dieses Buch behauptet, dass :: send vs :: sendto sein können bis zu 3x schneller, weil dieser Aufwand reduziert - Daten können direkt auf den NIC-Treiber gehen die meisten IP-Stack-Verarbeitung umgangen wird. Hochleistungs-Spiel Programmierer wollen kann dies berücksichtigen.

sollten Sie überprüfen, Beej Leitfaden für Netzwerk-Programmierung mit Internet Sockets, gibt es schöne Beispiele, die Ihre Adresse Frage.

Beachten Sie, dass das UDP-Protokoll ist ein „ verbindungslos “ Protokoll bedeutet, dass Sie nie mit dem Host zu verbinden, müssen Sie nur Daten senden. So können Sie, dass connect sehen kann als eine Aktion für UDP bedeutungslos ist.

Für UDP sollten Sie sendto () und Recvfrom () in dieser Funktion können Sie die Adresse angeben und die Puffer und das war es, alles andere, die bequem für Sie in TCP behandelt wird, wird Ihnen Griff Dinge auf eigene Faust haben gegangen .

In der MSDN-Dokumentation seiner erwähnt, dass Sie irgendwie in der Tat die normalen Sende- / recv Funktionen mit UDP verwenden können, aber warum sollten Sie, wenn Sie unterschiedliche Funktionen haben bereits? Wie andere für UDP bereits connect () kommentiert tut etwas anderes, es ist nicht im Wesentlichen ein „connect“ Betrieb, sondern eine Art von Filter einzurichten send () / recv () für UDP-Nutzung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top