2009-05-22 4 views
0

Есть ли способ проверить, отключен ли сокет на удаленном конце без select() в C?Проверьте, не отсоединен ли сокет в C без select()

Причина, по которой я не хочу использовать select(), заключается в том, что в случае заполнения моих буферов могут быть доступны данные для чтения в сокете, которые я намеренно игнорирую, и select (readfds = [socket_fd ]) всегда возвращался немедленно, давая мне знать.

ответ

4

Если у вас есть вызов функции блокировки read() в сокете и он возвращает целочисленное значение 0, это означает, что соединение сокета закрыто.

while (n = read(sockfd, buffer, BUFFER_SIZE)) { 
    //use buffer contents 
} 

Этот цикл будет продолжаться, пока данные отправляются с другого конца.

1

Таким образом, используйте poll(), установив events на то, что вам нужно, и проверив результаты в revents. FYI, вы можете позвонить select() или poll() без ущерба для сокетов или изменения их буферов.

+1

У меня есть некоторые проблемы при использовании poll(), как это, новички никогда не содержат POLLHUP, когда сокет зависает, просто POLLIN, который не может быть правдой. – unexist

+0

См. Http://www.greenend.org.uk/rjk/2001/06/poll.html для получения некоторой информации об этой проблеме. – dwc

Смежные вопросы