Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Non-nlocking sockets VS poll 
V
    Опции темы
Kappac
Дата 7.12.2009, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



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

Код

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. 
Заранее благодарен за любую помощь!
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 7.12.2009, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Код

sockets[count].events = POLLIN | POLLRDHUP;



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Kappac
Дата 7.12.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



Даже если так:
Код

sockets[count].events = POLLIN;

, то не работает.
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 7.12.2009, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



а если все-таки как я написал ;)
ну и скобки поставь, не помню точно, но по-моему приоритет у || больше чем у &


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Kappac
Дата 7.12.2009, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



Так тоже не работает. =( 
Вчера пол ночи на эти траблы потратил, попробовал и этот вариант в том числе. Закрываешь соединение - остается висеть сокет в CLOSE_WAIT.

Это сообщение отредактировал(а) Kappac - 7.12.2009, 23:26
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
Kappac
Дата 7.12.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



Извиняюсь, это правильное решение! 
Спасибо, Максим!

Добавлено через 3 минуты и 25 секунд
Остается только вопрос: в документации сказано, что устанавливать эти(POLLRDHUP, POLLHUP) флаги не имеет смысла, они сами генерируются в revents, при возникновении события, как это понимать?
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 8.12.2009, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Kappac
Дата 8.12.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



Он не генерируется, но и POLLHUP - не ловится... 


Это сообщение отредактировал(а) Kappac - 8.12.2009, 20:15
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 8.12.2009, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

POLLHUP генерируется для полной shutdown маски, т. е. просто если получен FIN снгмент, то это еще не является условием его генерации
код



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Kappac
Дата 8.12.2009, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



Получается, что при использовании close на сокете не происходит shutdown(socket, 2)? 
Последний вопрос, как правильно использовать POLLHUP | EPOLLHUP на сокетах подобного рода?
P.S. 
Спасибо за ссылку, очень инетерсно! 
P.P.S
Подобная информация есть в мане к epoll, но из нее не было понятно почему лучше использовать EPOLLRDHUP.

Это сообщение отредактировал(а) Kappac - 8.12.2009, 22:24
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 8.12.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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

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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Kappac
Дата 9.12.2009, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



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

Это все, конечно, хорошо! Допустим случай, когда в наличии ядро < 2.6.17, как тогда?
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
MAKCim
Дата 9.12.2009, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



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

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Kappac
Дата 9.12.2009, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 30.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



Спасибо! =) 
--------------------
                                                                                     
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.