2012-09-20 6 views
12

Ich bereite nur etwas Code auf, den wir vor einiger Zeit geschrieben haben, und habe bemerkt, dass für einen Udp-Socket 0 als Verbindung behandelt wird.Unter Linux, kann recv jemals 0 auf UDP zurückgeben?

Ich bin ziemlich sicher, dass dies das Ergebnis der Portierung der gleichen recv-Schleife aus der äquivalenten TCP-Version war. Aber ich frage mich. Kann recv 0 für udp zurückgeben? auf TCP signalisiert es das andere Ende hat die Verbindung geschlossen. UDP hat nicht das Konzept einer Verbindung also kann es 0 zurückgeben? und wenn es möglich ist, was ist es?

Hinweis: die Man-Seite in Linux unterscheidet nicht UDP und TCP für einen Return-Code von Null, weshalb wir den Code einchecken konnten.

+0

Sind die UDP-Buchsen angeschlossen oder nicht? –

+0

Sie können "connect" auf UDP-Sockets aufrufen, aber das bedeutet, dass dem UDP-Socket eine Remote-IP-Adresse/Port zugewiesen wird. Damit können Sie einfach "send" und "recv" ohne sendto, recvfrom aufrufen. Ich glaube, es fungiert auch als Filter und erlaubt Ihnen nur, Udp-Datagramme nur von dieser Adresse zu erhalten. In gewisser Weise sind sie miteinander verbunden, aber nicht mit TCP. – Matt

Antwort

12

udp hat nicht das Konzept einer Verbindung also kann es 0 zurückgeben? und wenn es kann, was ist das

Es bedeutet, dass ein Datagramm 0 Länge empfangen wurde. Aus der großen UNP:

ein Datagramm von Länge zu schreiben ist 0 akzeptabel. Im Fall von UDP führt dieses zu einem IP-Datagramm, das einen IP-Header enthält (normalerweise 20 Byte für IPv4 und 40 Byte für IPv6), einen 8-Byte-UDP-Header und keine Daten. Dies bedeutet auch, dass ein Rückgabewert von 0 von recvfrom ist akzeptabel für ein Datagramm-Protokoll: Es bedeutet nicht, dass der Peer die Verbindung geschlossen hat, wie ein Rückgabewert von 0 von einem TCP-Socket lesen. Da UDP verbindungslos ist, gibt es keine Verbindung zwischen UDP .

+0

Kann mich nicht erinnern, ist ein Datagramm garantiert geliefert oder nicht anders als TCP, wo Sie einige der Daten empfangen können. –

+0

@AdrianCornish Ich denke, alle modernen Stacks versuchen, es zu liefern, auch wenn es keine Nutzlast gibt. – cnicutar

+0

Phrasierte diese Frage schlecht - zum Beispiel könnte ich 100 Bytes über eine TCP-Verbindung senden und das andere Ende kann nur 50 bekommen und muss wieder lesen - so die eigentliche Frage ist, kann ein Datagramm in der Anwendungsschicht –

Verwandte Themen