| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > Non-nlocking sockets VS poll |
| Автор: Kappac 7.12.2009, 20:22 | ||||
Есть набор неблокирующих сокетов, настраиваемых следующим образом:
События обрабатываются следующим образом:
Проверка на возможность чтения(POLLIN) проходит идеально, но на закрытие соединения никак не хочет. Что я делаю не так? Может не те события жду? P.S. Заранее благодарен за любую помощь! |
| Автор: MAKCim 7.12.2009, 21:56 | ||
|
| Автор: Kappac 7.12.2009, 23:18 | ||
Даже если так:
, то не работает. |
| Автор: MAKCim 7.12.2009, 23:20 |
| а если все-таки как я написал ;) ну и скобки поставь, не помню точно, но по-моему приоритет у || больше чем у & |
| Автор: Kappac 7.12.2009, 23:25 |
| Так тоже не работает. =( Вчера пол ночи на эти траблы потратил, попробовал и этот вариант в том числе. Закрываешь соединение - остается висеть сокет в CLOSE_WAIT. |
| Автор: Kappac 7.12.2009, 23:43 |
| Извиняюсь, это правильное решение! Спасибо, Максим! Добавлено через 3 минуты и 25 секунд Остается только вопрос: в документации сказано, что устанавливать эти(POLLRDHUP, POLLHUP) флаги не имеет смысла, они сами генерируются в revents, при возникновении события, как это понимать? |
| Автор: Kappac 8.12.2009, 20:15 |
| Он не генерируется, но и POLLHUP - не ловится... |
| Автор: MAKCim 8.12.2009, 22:07 |
POLLHUP генерируется для полной shutdown маски, т. е. просто если получен FIN снгмент, то это еще не является условием его генерации http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/net/ipv4/tcp.c#L373 |
| Автор: Kappac 8.12.2009, 22:19 |
| Получается, что при использовании close на сокете не происходит shutdown(socket, 2)? Последний вопрос, как правильно использовать POLLHUP | EPOLLHUP на сокетах подобного рода? P.S. Спасибо за ссылку, очень инетерсно! P.P.S Подобная информация есть в мане к epoll, но из нее не было понятно почему лучше использовать EPOLLRDHUP. |
| Автор: MAKCim 8.12.2009, 23:07 | ||||
происходит но из epoll'а дескриптор удаляется при close() Добавлено через 1 минуту и 35 секунд
не париться по этому поводу POLLHUP - это более жесткий случай POLLRDHUP |
| Автор: Kappac 9.12.2009, 08:08 | ||
Это все, конечно, хорошо! Допустим случай, когда в наличии ядро < 2.6.17, как тогда? |
| Автор: MAKCim 9.12.2009, 09:38 | ||
получаем POLLIN, последующий recv() аозвращает 0 стандартный способ |
| Автор: Kappac 9.12.2009, 20:31 |
| Спасибо! =) |