Подскажите как отследить то что другая сторона на socket SOCK_STREAM отвалилась ? Делаю select() на предмет есть ли данные в потоке и если есть делаю recv.
А какой смысл делать fcntl(socket, F_SETFL, O_NONBLOCK);
если я до recv делаю select на чтение? Те типа recv и так не будет ничего ждать так как данные уже есть и select это сказал ?
> при разрыве соединения для операции чтения select сообщит
> что событие есть, а recv вернет 0 байт ?
правильно
> recv надо делать на nonblocking, событие select - на чтение,
> и при обрыве должно вернуться -1
неверно
> select вернет что результат что в сокете есть инфа на чтение
> а при чтении вернется -1. Это означает что сокет с удаленной
> стороны закрылся (close).
ну что вы пишете. после close() read() вернет 0.
ну проверьте, прежде чем писать. или смотрим
net/ipv4/tcp.c:tcp_recvmsg()
if (copied) {
....
} else {
if (sk->sk_shutdown & RCV_SHUTDOWN)
break;
}
....
return copied;