У вас есть неблокирующий сокет, и вы звоните в него connect()
.Поскольку connect()
требуется 3-х стороннее рукопожатие (так, например, сетевой обход), оно либо блокирует ожидание SYN-ACK в блокирующих сокетах, либо дает некоторое указание на то, что оно еще не преуспело в неблокирующих сокетах.Обычно неблокирующие сокеты возвращают EAGAIN / EWOULDBLOCK, чтобы сообщить вам, что они не могут прогрессировать, и вам следует повторить попытку: connect()
возвращает EAGAIN / EWOULDBLOCK, когда нет свободных эфемерных портов, чтобы сообщить вам, чтопопробуйте еще раз позже;поэтому существует еще одна ошибка для неблокирующего соединения: EINPROGRESS, которая сообщает вам, что операция выполняется, и вы должны проверить ее состояние позже.
Чтобы проверить состояние позже, сокет станет готовым для записи.так что вы можете использовать select()
/ poll()/...
для проверки этого, после чего вам нужно будет getsockopt(...SO_ERROR...)
, чтобы получить статус успеха / неудачи вашей операции connect ().