sockfd = accept(...);
// ...
while(1) {
fd_set rd;
// ...
FD_SET(sockfd, &rd);
// ...
select(nfds, rd, 0, 0, 0);
if(FD_ISSET(sockfd, &fd) {
ssize_t rd_sz;
rd_sz = recv(sockfd, buf, buf_sz, O_NONBLOCK)
// ...
}
}
если клиент закрывает соединение, то цикл начинает крутится без остановки — select сразу возвращает, что можно читать. recv возвращает 0
как идеологически правильно узнать, что клиент отвалился?
знаю о POLLRDHUP - но это только в linux'е и только с 2.6.17. ещё рассказали о хаке: можно написать в MSG_OOB если ошибка, то соединение крякнулось, но костыльно и в теории MSG_OOB может использоваться для чего-то полезного.