LINUX.ORG.RU

non-blocking sockets timeout poll()


0

0

Здравствуйте. В общем использую неблокирующие сокеты (чтобы не ждать вызов connect()), т.к. соектов несколько, использую poll(). На сокеты необходимо поставить таймаут. Если делать это в poll() - то он возвращается сразу же, как на каком то сокеты появилось событие, либо ждет таймаут, если вообещ ни на однмо сокете нет событий. У меня такая ситуация почти невозможно (сокетов много, где то все равно будет событие), т.е. есть большой шанс, что сокет будет висеть очень долго и нельзя будет определить его таймаут.

Если ставить таймаут через setsockopt() - то непонятно, как его отслеживать, потому что poll() не помечает на нем никаких событий, а на уровне SOL_SOCKET, SO_ERROR равен 0.

Как разрешить данную проблему? Как из множества неблокированных сокетов определить, что у каких то истек таймаут?

P.S. попробовал после вызова connect() вернуть сокет в блокирующий режим - ничего не изменилось, после возврата из poll() на тех сокетах, где точно истек таймаут, установленный по setsockopt(), на уровне SOL_SOCKET SO_ERROR не принимает ошибочные состояния, и revent равны 0

anonymous

Нет, все же сообщение об ошибке (timeout) появляется, но спустя 4 минуты, а не 30 секунад, как я устанавилваю через setsockopt...

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

Мож я чего то не понимаю - получается что просто невозможно изменить таймаут на connect() ? Он всегда 4 минуты ?..

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

> получается что просто невозможно изменить таймаут на connect() ?

можно, SO_SNDTIMEO, но он - естественно - игнорируется
для O_NONBLOCK сокетов.

изначального вопроса я не понял.

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

ставлю неблокирующий режим, таймаут (30 секунд), connect(), блокирующий режим, poll() с таймаутом (40 секунд). poll() возвращается с результатом 0 через 30 секунд. так раз 6 или 7, потом возвращается с результатом 1 (я ему передаю пока 1 сокет) и SO_ERROR говорит таймаут. через 4 минуты...

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