![]() |
|
Модераторы: xvr |
![]()
|
|
| Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: нет Всего: 3 |
Доброго времени суток!
Использую в сервере на С блокируемый read(), который ждет данные определенное время и если интервала ожидания превышен, то возвращает определенную ошибку. Если данные приходят битые и эта ошибка обнаруживается и обрабатывается стеком TCP/IP, то вернет ли read() управление и какую-то ошибку или нет? Я так понимаю, что нет, потому что это прикладной уровень, а ошибки нижележащих уровней обрабатываются самими этими уровнями. |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 16 Всего: 110 |
честно говоря, не понял вопроса...
|
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Это где вы такой read нашли? Единственный способ для read (в целом) вернуться по timeout'у - это слететь по сигналу (например SIGALARM). При этом в errno вернется ошибка EINTR (прерванный системный вызов)
Вы имеете в виду, что в read дали сокет, а противоположный конец взял и отвалился? Да, read вернется с 0 (насколько я помню) |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
||||
|
||||
| Ares4322 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 339 Регистрация: 25.9.2007 Где: Россия, Москва Репутация: нет Всего: 3 |
при возвращении управления read() проверяем возвращаемое значение. если 0, то произошла ошибка. И если при этом errno = EWOULDBLOCK, то, значит, истек таймаут. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Если приходят битые данные на прикладном уровне (http, ftp..., см. сетевую модель OSI), ты их получишь. Если же придут битые на транспортном уровне, то система сама решит проблему (для UDP проигнорирует, для TCP пошлет запрос на повтор) - т.е. твой read никак не отреагирует. Это сообщение отредактировал(а) bsa - 20.12.2011, 17:02 |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
Не совсем:
|
||||
|
|||||
![]()
|
| Правила форума "С/С++: Программирование под 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. |