2012-10-15 7 views
8

Ich habe zwei Paar Codes (server.c und client.c) in Linux geschrieben. Eine für UNIX-Domäne AF_UNIX andere für INTERNET-Domäne AF_INET. Beides funktioniert gut!listen() Warteschlangenlänge in Socket-Programmierung in c?

listen() heißt für Backlogwarteschlange Länge = 3 in both servers

listen(sockfd, 3); 

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

In INTERNET-Domäne (AF_INET): Anforderung von mehr als drei werden in einer Warteschlange für wartende gehalten.

Warum wird eine Anforderung von einem vierten Client nicht abgelehnt, selbst wenn die Länge der Rückstauwarteschlange drei ist? Und warum ist das Verhalten von listen() (und anderen) Protokoll abhängig?

+0

Ich verstehe nicht wirklich Ihre Absicht ... Warum sollten Sie jemals einen Client ablehnen, nur weil die Warteschlange voll ist? –

+1

@KarolyHorvath: Ich meine, es sollte abgelehnt werden, wenn ich die Warteschlange Länge gegeben. Und ich möchte das wissen. –

+0

@Grijesh Chauhan: theoretisch ... ja .. * praktisch * .. wen interessiert das? Warum stört dich das? –

Antwort

9

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

listen(int socket_fd, int backlog) 

Für einen gegebenen hören Socket Kernel zwei Warteschlangen.

  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 vollständige Verbindungswarteschlange - Drei-Wege-Handshake durchgeführt. (Established State)

Backlog Argument historisch Summe beider Warteschlangen angeben. 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 detaillierte und tiefgehende Erklärung in einem Buch von W. Richard Stevens gegeben. Eine Tabelle mit den Werten für sieben Betriebssysteme finden Sie auch in Stevens, Fenner, Rudoff, "Unix Network Programming: The Sockets Network API", Band 1, dritte Ausgabe, Seite 108.

+1

Zum Beispiel unter Linux 2.4.7 Ein "Rückstau" von 3, der an "listen()" gegeben wird, führt dazu, dass bis zu 6 Verbindungen in die Warteschlange eingereiht werden. –

+1

Editiert einige weitere Details in Sie beantworten. Vielen Dank! –

+0

CentOS 6.6 2.6.32-504.el6.x86_64 Die Backlog-Warteschlange ist Backlog-Parameter +1 – adrianlzt

3

Die Plattform ist berechtigt, den angegebenen Rückstand nach oben oder unten anzupassen, nach seinem Minimum und seinem Standardwert. 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 er kürzer als der Standardwert sein soll.