С Сокеты: Избегать мусора, когда сокет закрыт - PullRequest
5 голосов
/ 09 мая 2011

Я программирую сервер и клиент, используя неблокирующие сокеты (функция fd_sets и select), и как только сервер закрывает или закрывает клиентский сокет, клиент начинает получать много мусора, пока не выйдет из строя. , Меня предупредили, что при работе с select() сокет станет читабельным, когда соединение будет разорвано, но как я могу узнать в

if( FD_ISSET( socket, &read ) ) 
{
} 

если причина - обычные данные или соединение разорвано?

Большое спасибо!

Ответы [ 2 ]

6 голосов
/ 09 мая 2011

Наборы файловых дескрипторов не сообщат вам, если сокет закрыт, только о том, что вы можете попытаться прочитать его.Когда удаленный конец закроет соединение, розетка станет «читаемой».При попытке recv() возвращаемое значение будет равно 0, указывая, что сокет закрыт.Всегда проверяйте возвращаемые значения.

0 голосов
/ 13 декабря 2011

Вместо этого вам придется использовать poll (это также более гибко, поскольку оно не ограничено размером FD_SET!)

struct poll p = {.fd = fd, .events = POLLHUP|POLLRDHUP};
...