LINUX.ORG.RU

снова resv и select


0

0

Подскажите как отследить то что другая сторона на socket SOCK_STREAM отвалилась ? Делаю select() на предмет есть ли данные в потоке и если есть делаю recv.

anonymous

Правильно ли я понимаю что при разрыве соединения для операции чтения select сообщит что событие есть, а recv вернет 0 байт ?

anonymous
()
Ответ на: комментарий от anonymous

recv надо делать на nonblocking, событие select - на чтение, и при обрыве должно вернуться -1 - если судить по man страницам.

Spectr ★★★
()

Только что проверил - select возвращает что есть что читать - а recv возвращает 0 байт - типа сервер отвалился.

anonymous
()

А какой смысл делать fcntl(socket, F_SETFL, O_NONBLOCK);
если я до recv делаю select на чтение? Те типа recv и так не будет ничего ждать так как данные уже есть и select это сказал ?

anonymous
()
Ответ на: комментарий от anonymous

> при разрыве соединения для операции чтения select сообщит
> что событие есть, а recv вернет 0 байт ?

правильно

> recv надо делать на nonblocking, событие select - на чтение,
> и при обрыве должно вернуться -1

неверно

idle ★★★★★
()
Ответ на: комментарий от idle

>> recv надо делать на nonblocking, событие select - на чтение,
>> и при обрыве должно вернуться -1

>неверно???

select вернет что результат что в сокете есть инфа на чтение
а при чтении вернется -1. Это означает что сокет с удаленной стороны закрылся (close).

Aleks_IZA
()
Ответ на: комментарий от Aleks_IZA

> select вернет что результат что в сокете есть инфа на чтение
> а при чтении вернется -1. Это означает что сокет с удаленной
> стороны закрылся (close).

ну что вы пишете. после close() read() вернет 0.
ну проверьте, прежде чем писать. или смотрим
net/ipv4/tcp.c:tcp_recvmsg()

if (copied) {
        ....
} else {
        if (sk->sk_shutdown & RCV_SHUTDOWN)
                break;
}
....
return copied;

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.