recv () с errno = 107: (конечная точка транспорта подключена) - PullRequest
4 голосов
/ 25 января 2010

хорошо .. Я использую типичную модель epoll + многопоточность для обработки массивных сокетов, то есть у меня есть поток с именем epollWorkThread, который использует epoll_wait для обработки сокетов ввода-вывода. Пока есть событие EPOLLIN, recv () сделает всю работу, и я использую режим noblocking для немедленного возврата. И recv () действительно находится в цикле while (true). Все хорошо в начальное время (возможно, пару часов или, может быть, минуты или, если мне повезет, дни), я могу получить информацию. Но через некоторое время recv () настаивает на возвращении -1 с ошибкой = 107 (ENOTCONN). Другой узел транспорта записан в AS3, который гарантирует, что сокет подключен. Поэтому я смущен поведением recv (). Заранее спасибо и любой комментарий приветствуется!

1 Ответ

3 голосов
/ 12 января 2011

Errno 107 означает, что к разъему НЕ подключено (больше). Есть несколько причин, почему это могло произойти. Предполагая, что вы правы, и обе стороны соединения утверждают, что сокет все еще открыт, промежуточный маршрутизатор / коммутатор мог разорвать соединение из-за тайм-аута. Самый безопасный способ избежать подобных ситуаций - периодически отправлять сообщения «здоровье» или «поддерживать жизнь». (Таким образом, промежуточный маршрутизатор / коммутатор принимает соединение как живое ...) =

...