Удивительный вопрос :-). Вот почему я думаю, что это происходит. Стандарт гласит:
Если соединение не может быть установлено немедленно и O_NONBLOCK имеет значение
установить для файлового дескриптора для сокета, connect () должен произойти
установите errno на [EINPROGRESS]
Вопрос, конечно же, что означает "немедленно" . Я полагаю, что «немедленно» - это действительно небольшое время, которое позволяет SYN
, SYN-ACK
, ACK
произойти. Если бы он вообще не ожидал, у него был бы нулевой шанс на успех.
Так в основном:
- Клиент отправляет
SYN
- Ожидание (блоков) в течение небольшого промежутка времени («немедленно») в течение
SYN-ACK
.
- Завершает соединение
При этом он успешно возвращается вместо EADDRINUSE
.
Теперь, когда используются потоки, каждый поток делает это, так что никто не ждет. Все они просто connect(2)
, а переключение контекста позволяет всем делать это почти одновременно.