UDP und sockets, recvfrom() gibt -1 und Ressource vorübergehend nicht verfügbar
Ich habe einen client und einen server-Kommunikation mit Datagrammen (UDP) in C. Der client sendet 5 Nachrichten und nach dem empfangen der Nachrichten, der server sendet die Nachrichten zurück. Empfangen und senden von Nachrichten sind die großen, bis der client beendet hat, empfangen die Nachrichten. Nach der server sendet alle Nachrichten zurück, es endet mit close(). so recvfrom() von client sollte 0 zurückgeben, richtig?
Vorausgesetzt, recvfrom() soll 0 zurückgeben beim close() von server-Seite, es gibt -1 zurück, stattdessen mit Fehler Resource temporarily unavailable. Ist diese Ressource-Referenz für geschlossene socket-server? Oder ist es etwas anderes, ganz anderes wie Puffer oder so etwas (was ich nicht glaube, ist wahr)?
Vorausgesetzt, meine Annahme war falsch, und -1 wird zurückgegeben, da der server beendet, sollte ich wohl den Fehler behandeln mit
if(SOMEMACRO)
do something
Wie finde ich heraus, was SOMEMACRO
ist? Ich Drucke den Fehler, aber es sagt Ressource temp nicht verfügbar und recvfrom() Beschreibung nicht zu erwähnen, unavilable Ressource..?
Btw, dies ist ein non-blocking socket, wenn das macht keinen Unterschied, da ich gelesen habe, dass wenn O_NONBLOCK gesetzt ist und keine msg-Befehle sind verfügbar, es würde setzen Sie errno auf EAGAIN oder EWOULDBLOCK. O_NONBLOCK nicht gesetzt, aber MSG_DONTWAIT eingestellt ist. Sind Sie im Grunde die gleiche Sache, wo O_NONBLOCK ist für Allgemeine Datei-Deskriptoren und MSG_DONTWAIT ist socket-spezifisch ist??
Mein Gehirn funktioniert nicht so toll jetzt, wenn jemand könnte mich aufklären und verdeutlichen, was meine Verwirrung ist etwa, würde ich schätzen es. Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
UDP ist ein verbindungsloses Protokoll ist, im Gegensatz zu TCP, das verbindungsorientiert ist. Ihr Erhalt-code nicht wissen, ob oder nicht, der Absender hat geschlossen seinen sockel, es nur zu wissen, ob oder nicht es gibt Daten, die darauf warten, gelesen zu werden. Nach der man-Seite für recvfrom auf Linux:
Scheint dies zu sein, was geschieht für Sie
Edit: Beachten Sie, dass "resource temporarily unavailable" und EAGAIN sind die gleichen Fehler, man ist nur die benutzerfreundliche descption vs Namen definieren. Im Grunde ist es einfach nur gesagt, dass Sie versuchen, zu Lesen aus dem socket und gibt es keine Daten zu Lesen
Nachdem Ihr geschlossen haben, um den socket noch verweilt, um für irgendwann. In der Regel etwa zwei Minuten oder so. Um dies zu vermeiden, verwenden socket option SO_REUSEADDR.
Hier sind einige Hinweise für Sie.
http://msdn.microsoft.com/en-us/library/ms740476%28VS.85%29.aspx
http://docs.hp.com/en/B2355-90136/ch03s01.html
Und hier ist ein Beispiel, nach unten scrollen, um udp_listen Funktion:
http://www.codase.com/search/display?file=L2dlbnRvbzIvdmFyL3RtcC9yZXBvcy9jb2Rhc2UuYy9zbGlycC0xLjAuMTYvd29yay9zbGlycC0xLjAuMTYvc3JjL3VkcC5j&lang=c&off=15730+15796+