Модераторы: MuToGeN, marykone
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переполнение буфера сокета, как определить и что сделать можно 
V
    Опции темы
deadenka
Дата 13.2.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, all!

Проблема в следующем: приложение получает поток данных по UDP (скорость примерно 300 килобАЙт/сек). Есть сильное подозрение, что несмотря на то, что буфер приемного сокета приложения увеличен до максимума (setsockopt с опцией SO_RCVBUF), буфер все равно переполняется — иногда спустя некоторое время функция recv возвращает -1, а WSAGetLastError = 10055 (No buffer space available). Сокет работает в блокирующем режиме. Скажите, как нужно правильно прореагировать, если буфер сокета переполнился? Есть ли какие-то способы кроме как перезапустить программу или пересоздать сокет?
PM MAIL   Вверх
Imple
Дата 13.2.2008, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1546
Регистрация: 14.9.2007
Где: Алма-Ата

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



Просто очистить буффер можно?


--------------------
Не шалю, никого не трогаю, починяю сервер.
PM WWW ICQ Skype GTalk Jabber   Вверх
deadenka
Дата 13.2.2008, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Imple @ 13.2.2008,  15:47)
Просто очистить буффер можно?

Можно (собственно примерно это я и хочу), только как? Сокет работает в блокирующем режиме. 
PM MAIL   Вверх
Imple
Дата 14.2.2008, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1546
Регистрация: 14.9.2007
Где: Алма-Ата

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



Когда очередное переполнение будет, выполните команду 
Код

netstat -an


Еще попробуйте после получения WSA_IO_PENDING дать системе пофлушить все буфера, секунды должно хватить. Тем же sleepex().
Но все же у меня есть подозрение что у вас просто слишком много соединений.

Если ничего не поможет - переходите на TCP smile


--------------------
Не шалю, никого не трогаю, починяю сервер.
PM WWW ICQ Skype GTalk Jabber   Вверх
deadenka
Дата 14.2.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Imple @ 14.2.2008,  05:05)
Когда очередное переполнение будет, выполните команду 
Код

netstat -an


Еще попробуйте после получения WSA_IO_PENDING дать системе пофлушить все буфера, секунды должно хватить. Тем же sleepex().
Но все же у меня есть подозрение что у вас просто слишком много соединений.

Если ничего не поможет - переходите на TCP smile

Простите, а как именно получить WSA_IO_PENDING? Ему должно равняться значение, которое вернет WSAGetLastError после того, как recv вернет SOCKET_ERROR? то есть что-то вроде

if (SOCKET_ERROR==recv(...))
{
   if (WSA_IO_PENDING==::WSAGetLastError())
   {
      // Строчки вашего кода
   }
}

?

Соединение у меня всего одно... На TCP перейти тоже не могу - Cisco шлет либо по UDP на конкретный источник либо широковещательной рассылкой.
PM MAIL   Вверх
Imple
Дата 14.2.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1546
Регистрация: 14.9.2007
Где: Алма-Ата

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



Оно отдается в WSAGetLastError(). Если вы получили такой од ошибки, приостановите обработку на какое-то время. Около секунды.
И попробуйте более мелкими кусками слать данные...


--------------------
Не шалю, никого не трогаю, починяю сервер.
PM WWW ICQ Skype GTalk Jabber   Вверх
deadenka
Дата 14.2.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Imple @ 14.2.2008,  10:35)
Оно отдается в WSAGetLastError(). Если вы получили такой од ошибки, приостановите обработку на какое-то время. Около секунды.
И попробуйте более мелкими кусками слать данные...

Слать данные более мелко... Cisco шлет пакеты по netflow 5-й версии, там все равно размер записи четкий. Спасибо за ответ!
PM MAIL   Вверх
Imple
Дата 15.2.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1546
Регистрация: 14.9.2007
Где: Алма-Ата

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



deadenka, хоть вы и пометили тему решенной, достаточно интересно, удалось ли вам решить проблему? Если да, то как?


--------------------
Не шалю, никого не трогаю, починяю сервер.
PM WWW ICQ Skype GTalk Jabber   Вверх
Gwire
Дата 4.4.2017, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Интересно, так как все же очистить очередь входящих UDP-пакетов?

ПС: Пост зомби - 9 лет нерешенно решенный.
PM MAIL   Вверх
Google
  Дата 21.11.2017, 09:00 (ссылка)  





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


 




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


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

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