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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> странный эффект сокетов 
:(
    Опции темы
En_t_end
Дата 5.3.2006, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 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 я получил эффект простого засыпания программы(или сокета), что мне совсем не нравится.
PM MAIL ICQ Skype GTalk Jabber   Вверх
bilbobagginz
Дата 6.3.2006, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



тебе надо почитать man select.
таймаут нужно ставить подходящий или 0.
кстати, о каком UNIX идет речь ?


пока.

Это сообщение отредактировал(а) bilbobagginz - 6.3.2006, 00:54


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
En_t_end
Дата 6.3.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



bilbobagginz
linux redhat.
читал я man(также читал о переходе на кроссплатформенное программирование сокетов), понял, что select особо чувствителен к storage, в котором лежат handle(или их прототипы)... таймаут ставлю в пределах 40 секунд. Для теста посылаю данные, но select на другом конце игнорит readfs, smile честно меня это очень смешит, а потом, когда на другом конце клиент говорит что таймаут, всё сервер не отвечает, пора дисконнектиться, тут просыпается сервер и говорит, что соединение разорванно, причем, если попытаться прочитать то что находиться в стеке recv'ом, то там будет как раз то, что пришло. Так что точно отбрасывается то, что данные не доходят.
PM MAIL ICQ Skype GTalk Jabber   Вверх
bilbobagginz
Дата 7.3.2006, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



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


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
En_t_end
Дата 7.3.2006, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Короче я пришел к выводу, что я чего-то не до понял, походу в linux автоматически не генерятся событие onread у сокетов. Пожалуйста скажите каким образом можно настроить сокет(под linux) чтобы он менял состояние на onread, которое можно отлавливать select'ом. Извиняюсь за тупость.
PM MAIL ICQ Skype GTalk Jabber   Вверх
En_t_end
Дата 14.3.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Товарищи, я не могу добиться желаемого эффекта уже неделю, откликнитесь!
PM MAIL ICQ Skype GTalk Jabber   Вверх
AndrK
Дата 12.7.2006, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 12.7.2006

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



Первый параметр в select - это максимальный дескриптор+1, в твоем случае sock+1,
а у тебя он 0...
здесь поможет man select...
ЗЫ... кстати, в винде он игнорируется, может это тебя ввело в заблуждение...
 
PM MAIL   Вверх
MastEdm
Дата 12.7.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Master
*


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

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



Разберёмся на примерах...
Код

#include <unistd.h>
#include <fcntl.h>
...
sockfd = socket(AF_INET, SOCK_STREAM, 0);
fcntl(sockfd, F_SETFL, O_NONBLOCK);
...

Такая операция превращает сокет в неблокирующий. Вызов любой функции с таким сокетом будет возвращать управление немедленно.

Теперь об использовании самого select'а. 
Код

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int select(int n, fd_set *readfds, fd_set *writefds,
                fd_set *exceptfds, struct timeval *timeout);

FD_CLR(int fd, fd_set *set);
FD_ISSET(int fd, fd_set *set);
FD_SET(int fd, fd_set *set);
FD_ZERO(int fd);

Функция select работает с тремя множествами дескрипторов, каждое из которых имеет тип fd_set. В множество readfds записываются дескрипторы сокетов, из которых нам требуется читать данные (слушающие сокеты добавляются в это же множество). Множество writefds должно содержать дескрипторы сокетов, в которые мы собираемся писать, а exceptfds - дескрипторы сокетов, которые нужно контролировать на возникновение ошибки. Если какое-то множество нас не интересуют, мы можем передать вместо указателя на него NULL. Что касается других параметров, в n нужно записать максимальное значение дескриптора по всем множествам плюс единица, а в timeout - величину таймаута. Структура timeval имеет следующий формат:
Код

struct timeval {
    int tv_sec;     // секунды
    int tv_usec;    // микросекунды
};

Если хотя бы один сокет готов к выполнению заданной операции, select возвращает ненулевое значение, а все дескрипторы, которые привели к "срабатыванию" функции, записываются в соответствующие множества. Это позволяет нам проанализировать содержащиеся в множествах дескрипторы и выполнить над ними необходимые действия. Если сработал таймаут, select возвращает ноль, а в случае ошибки -1. Расширенный код записывается в errno.

Вот в двух словах о работе select... 
PM MAIL   Вверх
Pete
Дата 16.7.2006, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, не забудь, что select() изменяет fd_set:

  

Это сообщение отредактировал(а) Pete - 16.7.2006, 23:09


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

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

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


 




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


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

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