WinSock - Error 10054
-
Hallo.
Ich habe eine UDP Peer-to-Peer "Verbindung". Ursprünglich hatte jeder Teilnehmer ein Empfänger-Socket und ein Sender-Socket, jedoch wollte das NAT dann nicht ganz so mitmachen. Aus diesem Grund senden und empfangen die Teilnehmer nun die Daten über ein Socket.Die verbindung sieht nun in etwa so aus:
start() { sock = create_socket(); bind_socket(sock, port:9999); } update() { while(1) { select(sock, ...); if(ISSET(recvfrom(sock, ...)) { // Aktualliesiere empfangene Daten } else { // Alles empfangen! break; } } sendto(sock, packetA, ..., ip_port_anderer_teilnehmer); sendto(sock, packetB, ..., ip_port_anderer_teilnehmer); sendto(sock, packetC, ..., ip_port_anderer_teilnehmer); sendto(sock, packetD, ..., ip_port_anderer_teilnehmer); }
Das ganze Funktioniert soweit einwandfrei, bis auf eine Sache: Wenn der andere Teilnehmer nicht mehr im Netzwerk ist, also wenn die gesendeten Packete nicht an ihr Ziel kommen, meldet der SENDER beim recvfrom() Aufruf einen Fehler, mit dem Code: 10054 (WSAECONNRESET)
Die Fehlerbeschreibung aus der MSDN dazu:
Eine vorhandene Verbindung wurde vom Remotehost geschlossen. Normalerweise wird dieser Fehler ausgelöst, wenn die Peeranwendung auf dem Remotehost plötzlich beendet wird, der Host neu gestartet wird, der Host oder die Remotenetzwerkschnittstelle deaktiviert wird oder der Remotehost die Verbindung schließt, ohne ausstehende Aktionen zu berücksichtigen (unter setsockopt finden Sie weitere Informationen zur SO_LINGER-Option für den Remotesocket). Dieser Fehler tritt möglicherweise auch auf, wenn eine Verbindung aufgrund von Keepalive-Aktivitäten unterbrochen wurde, da während der Ausführung eines oder mehrerer Vorgänge ein Fehler erkannt wurde. Vorgänge, die noch nicht abgeschlossen worden sind, schlagen fehl und erzeugen den Fehler WSAENETRESET. Nachfolgende Vorgänge schlagen mit WSAECONNRESET fehl.
Soweit würde mich das eigentlich garnicht stören, wenn die select() Funktion nicht immer die Filedeskriptoren setzen würde! Kann man dies irgentwie verhindern, oder noch besser, gleich ganz verhindern, dass dieser Fehler auftaucht. Wenn der Fehler beim sendto() kommen würde, würde mich das sogar eher freuen als stören, weil ich dann entsprechen drauf reagieren kann, aber das der Fehler beim revfrom() auftaucht verwirrt mich ein wenig, vorallem obwohl dieses Packet ja nichteinmal für mich bestimmt ist, sondern für den anderen Teilnehmer.
Also kurz zusammengefasst: Wenn sendto() das Ziel nicht erreicht, erhalte ich beim nächsten recvfrom() den Fehlercode 10054.
Ist es überhaupt legal, zum Senden und Empfangen von UDP Paketen das gleiche Socket zu nutzen?
Vielen Dank!
-
C kennt keine Sockets. Stelle deine Frage im entsprechenden Subforum.