2016-06-03 9 views
2

Ich habe eine passive Buchse, die Verbindungen wie diese hören:Warum erhalte ich keinen Fehler, wenn ich mehr Sockets verbinde als das Argument backlog, das ich höre?

t = listen(fd, 1); 

fd ist die Dateibeschreibung der zuvor erstellten Fassung.
Wie Sie sehen können und wenn ich es gut verstehe, sollte listen() in der Lage sein, nur einen eingehenden Socket in seine Warteschlange ausstehender Verbindungen zu setzen (weil sein Backlog-Argument = 1). Aber wenn ich versuche, mehrere Sockets mit dem passiven zu verbinden, bekomme ich keinen Fehler. Und ich erwarte einen ECONNREFUSED Fehler, weil die Warteschlange voll ist.

Warum vermisse ich?

+0

Haben Sie eine Paketerfassung durchgeführt und überprüft, ob Sie SYN-ACK vom Server erhalten? – jxh

+0

Der Backlog-Parameter ist nur ein Hinweis, [siehe diese Antwort] (http://stackoverflow.com/questions/5111040/listen-ignores-the-backlog-argument). Das effektive Minimum für Linux scheint 16 zu sein. –

+0

@jxh nein Ich habe es nicht überprüft, was könnte ich schlussfolgern, wenn es der Fall ist oder nicht? – Simon

Antwort

2

Wie pro man listen(2), emphasis Mine:

Der Rückstand Argument definiert die maximale Länge, um die die Warteschlange der anhängigen Verbindungen für sockfd wachsen. Wenn eine Verbindungsanforderung ankommt, wenn die Warteschlange voll ist, wird der Client kann einen Fehler mit einen Hinweis auf ECONNREFUSED oder, wenn das zugrunde liegende Protokoll erneute Übertragung unterstützt, kann die Anforderung ignoriert werden, so daß ein späteren erneut versuchen, an der Verbindung gelingt.

Wenn Sie TCP-Sockets verwenden, wird das Verhalten erwartet, da TCP die erneute Übertragung unterstützt.

+0

Also gibt es keine Grenze mit TCP? Wie kann ich trotzdem einen einstellen? – Simon

+1

Aus der Perspektive eines Servers gibt es ein Limit, und es ist genau die Nummer, die Sie an 'listen()' liefern. Alle anderen Verbindungsversuche werden ignoriert. Aus der Client-Perspektive wird es scheinen, als ob ein 'connect()' einfach viel Zeit braucht. Ich denke, die Implementierung Timeouts ist eine gute Lösung, so dass Client-Code nicht unbegrenzt (oder für eine lange Zeit) blockiert. – leovp