|
Модераторы: marykone |
|
deadenka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 13.2.2008 Репутация: нет Всего: нет |
Здравствуйте, all!
Проблема в следующем: приложение получает поток данных по UDP (скорость примерно 300 килобАЙт/сек). Есть сильное подозрение, что несмотря на то, что буфер приемного сокета приложения увеличен до максимума (setsockopt с опцией SO_RCVBUF), буфер все равно переполняется — иногда спустя некоторое время функция recv возвращает -1, а WSAGetLastError = 10055 (No buffer space available). Сокет работает в блокирующем режиме. Скажите, как нужно правильно прореагировать, если буфер сокета переполнился? Есть ли какие-то способы кроме как перезапустить программу или пересоздать сокет? |
|||
|
||||
Imple |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1546 Регистрация: 14.9.2007 Где: Алма-Ата Репутация: 7 Всего: 87 |
Просто очистить буффер можно?
-------------------- Не шалю, никого не трогаю, починяю сервер. |
|||
|
||||
deadenka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 13.2.2008 Репутация: нет Всего: нет |
Можно (собственно примерно это я и хочу), только как? Сокет работает в блокирующем режиме. |
|||
|
||||
Imple |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1546 Регистрация: 14.9.2007 Где: Алма-Ата Репутация: 7 Всего: 87 |
Когда очередное переполнение будет, выполните команду
Еще попробуйте после получения WSA_IO_PENDING дать системе пофлушить все буфера, секунды должно хватить. Тем же sleepex(). Но все же у меня есть подозрение что у вас просто слишком много соединений. Если ничего не поможет - переходите на TCP -------------------- Не шалю, никого не трогаю, починяю сервер. |
|||
|
||||
deadenka |
|
||||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 13.2.2008 Репутация: нет Всего: нет |
Простите, а как именно получить WSA_IO_PENDING? Ему должно равняться значение, которое вернет WSAGetLastError после того, как recv вернет SOCKET_ERROR? то есть что-то вроде if (SOCKET_ERROR==recv(...)) { if (WSA_IO_PENDING==::WSAGetLastError()) { // Строчки вашего кода } } ? Соединение у меня всего одно... На TCP перейти тоже не могу - Cisco шлет либо по UDP на конкретный источник либо широковещательной рассылкой. |
||||
|
|||||
Imple |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1546 Регистрация: 14.9.2007 Где: Алма-Ата Репутация: 7 Всего: 87 |
Оно отдается в WSAGetLastError(). Если вы получили такой од ошибки, приостановите обработку на какое-то время. Около секунды.
И попробуйте более мелкими кусками слать данные... -------------------- Не шалю, никого не трогаю, починяю сервер. |
|||
|
||||
deadenka |
|
|||
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 13.2.2008 Репутация: нет Всего: нет |
Слать данные более мелко... Cisco шлет пакеты по netflow 5-й версии, там все равно размер записи четкий. Спасибо за ответ! |
|||
|
||||
Imple |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1546 Регистрация: 14.9.2007 Где: Алма-Ата Репутация: 7 Всего: 87 |
deadenka, хоть вы и пометили тему решенной, достаточно интересно, удалось ли вам решить проблему? Если да, то как?
-------------------- Не шалю, никого не трогаю, починяю сервер. |
|||
|
||||
Gwire |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: нет Всего: 4 |
Интересно, так как все же очистить очередь входящих UDP-пакетов?
ПС: Пост зомби - 9 лет нерешенно решенный. |
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Сетевые технологии | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |