![]() |
|
Модераторы: xvr |
![]()
|
|
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Под winsock я юзал механизм не блокирующих сокетов, примерно так:
timeval ReceiveTimeout; ReceiveTimeout.tv_sec = time_out; ReceiveTimeout.tv_usec = 0; fd_set fds; while(recived < len) { FD_ZERO(&fds); FD_SET(sock,&fds); select(0, &fds, NULL, NULL, &ReceiveTimeout); if(FD_ISSET(sock, &fds)) { //принимаем } else { //тайм аут } } В *nix я получил эффект простого засыпания программы(или сокета), что мне совсем не нравится. |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
тебе надо почитать man select.
таймаут нужно ставить подходящий или 0. кстати, о каком UNIX идет речь ? пока. Это сообщение отредактировал(а) bilbobagginz - 6.3.2006, 00:54 -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
bilbobagginz
linux redhat. читал я man(также читал о переходе на кроссплатформенное программирование сокетов), понял, что select особо чувствителен к storage, в котором лежат handle(или их прототипы)... таймаут ставлю в пределах 40 секунд. Для теста посылаю данные, но select на другом конце игнорит readfs, |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
мне кажется что плохо настроены сокеты .. ( либо сервера либо клиента либо обоих. )
сокет не будет каждый символ создавать событие, поэтому, вопрос каждые сколько символов твой сокет создает событие ? ты это настраивал ? не обижайся, но можно посмотреть коммуникационный код? ( включая настройки сокетов ) -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Короче я пришел к выводу, что я чего-то не до понял, походу в linux автоматически не генерятся событие onread у сокетов. Пожалуйста скажите каким образом можно настроить сокет(под linux) чтобы он менял состояние на onread, которое можно отлавливать select'ом. Извиняюсь за тупость.
|
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: нет Всего: 20 |
Товарищи, я не могу добиться желаемого эффекта уже неделю, откликнитесь!
|
|||
|
||||
| AndrK |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 12.7.2006 Репутация: нет Всего: нет |
Первый параметр в select - это максимальный дескриптор+1, в твоем случае sock+1,
а у тебя он 0... здесь поможет man select... ЗЫ... кстати, в винде он игнорируется, может это тебя ввело в заблуждение... |
|||
|
||||
| MastEdm |
|
||||||
![]() Master ![]() Профиль Группа: Участник Сообщений: 178 Регистрация: 3.12.2005 Где: Москва, МГИУ Репутация: нет Всего: 2 |
Разберёмся на примерах...
Такая операция превращает сокет в неблокирующий. Вызов любой функции с таким сокетом будет возвращать управление немедленно. Теперь об использовании самого select'а.
Функция select работает с тремя множествами дескрипторов, каждое из которых имеет тип fd_set. В множество readfds записываются дескрипторы сокетов, из которых нам требуется читать данные (слушающие сокеты добавляются в это же множество). Множество writefds должно содержать дескрипторы сокетов, в которые мы собираемся писать, а exceptfds - дескрипторы сокетов, которые нужно контролировать на возникновение ошибки. Если какое-то множество нас не интересуют, мы можем передать вместо указателя на него NULL. Что касается других параметров, в n нужно записать максимальное значение дескриптора по всем множествам плюс единица, а в timeout - величину таймаута. Структура timeval имеет следующий формат:
Если хотя бы один сокет готов к выполнению заданной операции, select возвращает ненулевое значение, а все дескрипторы, которые привели к "срабатыванию" функции, записываются в соответствующие множества. Это позволяет нам проанализировать содержащиеся в множествах дескрипторы и выполнить над ними необходимые действия. Если сработал таймаут, select возвращает ноль, а в случае ошибки -1. Расширенный код записывается в errno. Вот в двух словах о работе select... |
||||||
|
|||||||
| Pete |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 318 Регистрация: 5.1.2006 Где: Москва Репутация: нет Всего: 12 |
Да, не забудь, что select() изменяет fd_set:
Это сообщение отредактировал(а) Pete - 16.7.2006, 23:09 -------------------- Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу) Не откладывай на завтра то, что можешь сделать сегодня. (Пословица) А теперь выпишем точное значение числа пи... (Препод) Жахни, Пендальф! © Гоблин |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |