listen () Warteschlangenlänge in Socket-Programmierung in c?

8

Ich habe unter Linux zwei Codes geschrieben ( server.c und client.c ). Eine für die UNIX-Domäne AF_UNIX andere für die INTERNET-Domäne AF_INET . Beides funktioniert gut!

listen() heißt für die Länge der Backlog-Warteschlange = 3 in both servers

%Vor%

In der UNIX-Domäne (AF_UNIX): Während ein Client mit dem Server verbunden ist, wenn ich versuche, weitere Clients mit dem Server zu verbinden. Drei werden in der Warteschlange gehalten, und die Anfrage der vierten wird abgelehnt. (wie ich wollte - 3 in der Warteschlange).

In der INTERNET-Domäne (AF_INET): Anforderungen von mehr als drei werden in einer ausstehenden Warteschlange gehalten.

Warum wird eine Anforderung von einem vierten Client nicht zurückgewiesen, selbst wenn die Länge der Backlog-Warteschlange drei ist? Und warum ist das Verhalten von listen() (und anderen) protokollabhängig?

    
Grijesh Chauhan 15.10.2012, 10:05
quelle

2 Antworten

9

Betriebssysteme verwenden für eingehende TCP-Verbindungen tatsächlich größere Warteschlangen als für listen() . Wie viel größer ist abhängig vom Betriebssystem.

%Vor%

Für einen gegebenen Listening-Socket behält Kernal zwei Warteschlangen bei.

  1. Eine unvollständige Verbindungswarteschlange - für die SYN gekommen ist, aber Drei-Wege-Handshake (TCP) ist nicht vollständig abgeschlossen. (SYN_RCV-Zustand)
  2. Eine komplette Verbindungswarteschlange - Drei-Wege-Handshake erledigt. (HERGESTELLTER Staat)
Das

Backlog Argument gibt die Summe beider Warteschlangen in der Vergangenheit an. Aber es gibt keine formale Definition dessen, was Rückstand bedeutet.

Berkeley-abgeleitete Implementierung fügt einen Fudge-Faktor zum Rückstand hinzu. Also Gesamtwarteschlange length = factor * backlog .

Eine sehr ausführliche und tiefgehende Erklärung in einem Buch von W. Richard Stevens. Eine Tabelle mit den Werten für sieben Betriebssysteme findet sich auch in Stevens, Fenner, Rudoff, http://books.google.co.in/books?id=ptSC4LpwGA0C&printsec=frontcover&dq= unix% 20network% 20programming% 20the% 20sockets% 20network% 20api% 20volume% 201% 20third% 20edition% 20google% 20books & amp; quelle = bl & amp; ots = Kr5xNpglTq & amp; sig = w06efLjz6Qsl2Z6sCWrDv0XYIZk & amp; hl = en & sa = X & amp; ei = QON7UNuXDobUrQeT_ICADQ & amp; ved = 0CDAQ6AEwAA # v = eine Seite & amp; q & amp; f = falsch "> Unix-Netzwerkprogrammierung: Die Sockets-Netzwerk-API ", Band 1, dritte Ausgabe, Seite 108.

    
Seg Fault 15.10.2012, 10:18
quelle
3

Die Plattform ist berechtigt, den angegebenen Rückstand nach seinem Minimum und seinem Default nach oben oder unten anzupassen. Heutzutage ist der Standardwert eher wie 500 als fünf, wo es ungefähr 1983 begann. Sie können sich nicht darauf verlassen, dass es das ist, was Sie angegeben haben, und es gibt keine API, um herauszufinden, was es wirklich ist, und es ist nicht ersichtlich gültiger Anwendungsgrund dafür, dass es kürzer als der Standardwert sein soll.

    
EJP 15.10.2012 10:19
quelle