Wenn ich 100 non-block Socket-Verbindung in 1 Thread mache, ist es sehr langsam (die Anzahl der Verbindungen erhöht sich um eins), aber wenn ich eine blockierende Socket-Verbindung in 100 parallelen Threads mache (eine Verbindung pro Thread), es ist sehr schnell (sofort erledigt)
%Vor%Tolle Frage :-). Hier ist, warum ich denke, dass das passiert. Der Standard sagt das:
Wenn die Verbindung nicht hergestellt werden kann sofort und O_NONBLOCK ist set für den Dateideskriptor für den Socket, sollte connect () fehlschlagen und Setze errno auf [EINPROGRESS]
Die Frage ist natürlich was "sofort" bedeutet . Ich glaube, dass "sofort" tatsächlich eine kleine Zeit ist, in der die SYN
, SYN-ACK
, ACK
passieren können. Wenn es überhaupt nicht warten würde, hätte es eine 0-Chance, tatsächlich zu bestehen.
Also im Grunde:
SYN
SYN-ACK
. Dabei wird anstelle von EADDRINUSE
erfolgreich zurückgegeben.
Nun, wenn Threads verwendet werden, tut dies jeder Thread so, dass niemand wartet. Sie alle nur connect(2)
und Kontextwechsel ermöglicht es jedem, es fast gleichzeitig zu tun.