Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Non-nlocking sockets VS poll


Автор: Kappac 7.12.2009, 20:22
Есть набор неблокирующих сокетов, настраиваемых следующим образом:

Код

struct pollfd sockets[MAX_QUEUE];

...........

int flags = 0;
flags = fcntl(sockets[count].fd, F_GETFL, 0);
fcntl(sockets[count].fd, F_SETFL, flags | O_NONBLOCK);

...............

sockets[count].events = POLLIN;


События обрабатываются следующим образом:

Код

if( sockets[count].revents & POLLIN ) {
.........
}

if( sockets[count].revents & POLLHUP || sockets[count].revents & POLLRDHUP ) {
............
}


Проверка на возможность чтения(POLLIN) проходит идеально, но на закрытие соединения никак не хочет.
Что я делаю не так? Может не те события жду? 

P.S. 
Заранее благодарен за любую помощь!

Автор: MAKCim 7.12.2009, 21:56
Код

sockets[count].events = POLLIN | POLLRDHUP;

Автор: Kappac 7.12.2009, 23:18
Даже если так:
Код

sockets[count].events = POLLIN;

, то не работает.

Автор: 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, при возникновении события, как это понимать?

Автор: MAKCim 8.12.2009, 00:28
Цитата(Kappac @  7.12.2009,  23:43 Найти цитируемый пост)
флаги не имеет смысла, они сами генерируются в revents, при возникновении события, как это понимать? 

так и понимать
только POLLRDHUP автоматически не генерируется ;)

Автор: Kappac 8.12.2009, 20:15
Он не генерируется, но и POLLHUP - не ловится... 

Автор: MAKCim 8.12.2009, 22:07
Цитата(Kappac @  8.12.2009,  20:15 Найти цитируемый пост)
Он не генерируется, но и POLLHUP - не ловится... 

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
Цитата(Kappac @  8.12.2009,  22:19 Найти цитируемый пост)
Получается, что при использовании close на сокете не происходит shutdown(socket, 2)? 

происходит
но из epoll'а дескриптор удаляется при close()

Добавлено через 1 минуту и 35 секунд
Цитата(Kappac @  8.12.2009,  22:19 Найти цитируемый пост)
Последний вопрос, как правильно использовать POLLHUP | EPOLLHUP на сокетах подобного рода?

не париться по этому поводу
POLLHUP - это более жесткий случай POLLRDHUP

Автор: Kappac 9.12.2009, 08:08
Цитата(MAKCim @  8.12.2009,  23:07 Найти цитируемый пост)
не париться по этому поводу
POLLHUP - это более жесткий случай POLLRDHUP

Это все, конечно, хорошо! Допустим случай, когда в наличии ядро < 2.6.17, как тогда?

Автор: MAKCim 9.12.2009, 09:38
Цитата(Kappac @  9.12.2009,  08:08 Найти цитируемый пост)
Это все, конечно, хорошо! Допустим случай, когда в наличии ядро < 2.6.17, как тогда? 

получаем POLLIN, последующий recv() аозвращает 0
стандартный способ

Автор: Kappac 9.12.2009, 20:31
Спасибо! =) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)