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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возвращение из read() с таймаутом 
:(
    Опции темы
Ares4322
Дата 20.12.2011, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброго времени суток!
Использую в сервере на С блокируемый read(), который ждет данные определенное время и если интервала ожидания превышен, то возвращает определенную ошибку. 
Если данные приходят битые и эта ошибка обнаруживается и обрабатывается стеком TCP/IP, то вернет ли read() управление и какую-то ошибку или нет? Я так понимаю, что нет, потому что это прикладной уровень, а ошибки нижележащих уровней обрабатываются самими этими уровнями.
PM MAIL   Вверх
boostcoder
Дата 20.12.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

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



честно говоря, не понял вопроса... smile 
PM WWW   Вверх
xvr
Дата 20.12.2011, 15:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Ares4322 @  20.12.2011,  14:23 Найти цитируемый пост)
Использую в сервере на С блокируемый read(), который ждет данные определенное время и если интервала ожидания превышен, то возвращает определенную ошибку. 

Это где вы такой read нашли? Единственный способ для read (в целом) вернуться по timeout'у - это слететь по сигналу (например SIGALARM). При этом в errno вернется ошибка EINTR (прерванный системный вызов)
 
Цитата(Ares4322 @  20.12.2011,  14:23 Найти цитируемый пост)
Если данные приходят битые и эта ошибка обнаруживается и обрабатывается стеком TCP/IP, то вернет ли read() управление и какую-то ошибку или нет?

Вы имеете в виду, что в read дали сокет, а противоположный конец взял и отвалился? Да, read вернется с 0 (насколько я помню)

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


Эксперт
****


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

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



Цитата(xvr @  20.12.2011,  16:23 Найти цитируемый пост)
Единственный способ для read (в целом) вернуться по timeout'у - это слететь по сигналу 

Не только. Может быть у него read дополненный select'ом  smile 
PM   Вверх
Ares4322
Дата 20.12.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

 struct timeval tv;
 tv.tv_sec = connection_closing_timeout;
 tv.tv_usec = 0;
 setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof (tv));


при возвращении управления read() проверяем возвращаемое значение. если 0, то произошла ошибка. И если при этом errno = EWOULDBLOCK, то, значит, истек таймаут.
PM MAIL   Вверх
bsa
Дата 20.12.2011, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Ares4322 @  20.12.2011,  15:23 Найти цитируемый пост)
Если данные приходят битые и эта ошибка обнаруживается и обрабатывается стеком TCP/IP, то вернет ли read() управление и какую-то ошибку или нет? Я так понимаю, что нет, потому что это прикладной уровень, а ошибки нижележащих уровней обрабатываются самими этими уровнями. 

Если приходят битые данные на прикладном уровне (http, ftp..., см. сетевую модель OSI), ты их получишь. Если же придут битые на транспортном уровне, то система сама решит проблему (для UDP проигнорирует, для TCP пошлет запрос на повтор) - т.е. твой read никак не отреагирует.

Это сообщение отредактировал(а) bsa - 20.12.2011, 17:02
PM   Вверх
xvr
Дата 20.12.2011, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Ares4322 @  20.12.2011,  16:44 Найти цитируемый пост)
при возвращении управления read() проверяем возвращаемое значение. если 0, то произошла ошибка. И если при этом errno = EWOULDBLOCK, то, значит, истек таймаут. 

Не совсем:
Цитата

SO_RCVTIMEO and SO_SNDTIMEO
    Specify the receiving or sending timeouts until reporting an error. The argument is a struct timeval. If an input or output function blocks for this period of time, and data has been sent or received, the return value of that function will be the amount of data transferred; if no data has been transferred and the timeout has been reached then -1 is returned with errno set to EAGAIN or EWOULDBLOCK just as if the socket was specified to be nonblocking. If the timeout is set to zero (the default) then the operation will never timeout.
Т.е. для таймаута read должен вернуть -1 и errno может быть как EWOULDBLOCK, так и EAGAIN 

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

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

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


 




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


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

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