Situation: Der Server ruft accept () auf. Der Client sendet ein SYN an den Server. Der Server erhält das SYN und sendet dann ein SYN / ACK zurück an den Client. Der Client legt jedoch jetzt auf / stirbt, sodass es nie wieder einen ACK an den Server sendet.
Was passiert? Gibt accept () zurück, sobald es das SYN empfängt, oder blockiert es, bis die ACK des Clients zurückgegeben wird? Wenn es blockiert, gibt es schließlich eine Zeitüberschreitung?
Der Aufruf von accept()
blockiert, bis eine Verbindung besteht. Solange und bis der 3-Wege-Handshake abgeschlossen ist, ist keine Verbindung , daher sollte accept()
nicht zurückkehren. Für nicht blockierende Sockets wird es nicht blockiert, aber es gibt auch keine Informationen über teilweise abgeschlossene Handshakes.
Es wird eventuell eine Zeitüberschreitung auftreten, da dieses Szenario tatsächlich einem DoS (Denial of Service) und der Ressource für das Akzeptieren zur Verwendung durch das Betriebssystem gegenübersteht. Dies kann dazu führen, dass der Master-Socket blockiert wird, da der Client mit dem Server verbunden ist, sobald das Akzeptieren mit einem gültigen Datei-Deskriptor
zurückkehrtFalls während der Verbindung vom Client ein Fehler auftritt, wird der Wert errno gesetzt und eine gute Idee wäre das Protokoll oder die Anzeige einer Fehlermeldung. aber lesen Sie die man-Seiten, es ist die beste Informationsquelle in den meisten Fällen.
Tags und Links sockets posix networking tcp