Каковы возможные причины ошибки сокета EINPROGRESS в солярисе? - PullRequest
6 голосов
/ 26 ноября 2011

Каковы возможные причины ошибки сокета EINPROGRESS в Solaris? Как мы можем проверить причину?

API-интерфейс tcp: connect

Ответы [ 3 ]

17 голосов
/ 26 ноября 2011

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

Чтобы проверить состояние позже, сокет станет готовым для записи.так что вы можете использовать select() / poll()/... для проверки этого, после чего вам нужно будет getsockopt(...SO_ERROR...), чтобы получить статус успеха / неудачи вашей операции connect ().

8 голосов
/ 26 ноября 2011

Вы, очевидно, используете неблокирующие сокеты, и вам нужно использовать select() или poll(), чтобы определить, когда вы можете записывать (соединение - это форма записи) в сокет.То же самое, когда вы хотите записать данные в подключенный сокет;вы не просто пишете и подключаетесь, когда вам это нравится, вы просите сокет сообщить вам, когда вы можете что-то делать, а тем временем делаете что-то еще (идея асинхронных операций с сокетом).

ПроверкаВаша справочная страница для абсолютной правды о доступных кодах ошибок:

$ man connect

[EINPROGRESS] Разъем не является блокирующим, и соединение не может быть установлено немедленно.Можно выбрать (2) для завершения, выбрав гнездо для записи.

0 голосов
/ 04 августа 2017

Я получил эту ошибку при попытке подключиться (используя FFMPEG) к неверному локальному IP-адресу (т. Е. Неверной подсети), исправление хоста устранило проблему

...