Переполнение буфера сокета сервера UDP

Я пишу приложение C++ для Linux. В моем приложении есть сервер UDP, который отправляет данные клиентам о некоторых событиях. Сервер UDP также получает обратную связь/подтверждение от клиентов.

Для реализации этого приложения я использовал один сокет UDP (, например.int fdSocket)отправлять и получать данные от всех клиентов. Я привязал этот сокет к порту 8080 и установил сокет в НЕБЛОКИРУЕМЫЙ _режим.

Я создал две темы. В одном потоке я жду, когда произойдет какое-то событие, и если событие происходит, я использую fdsocket для отправки данных всем клиентам (в цикле for ).

В другом потоке я использую fdSocketдля получения данных от клиентов(recvfrom()). Этот поток планируется запускать каждые 4 секунды (, т. е. каждые 4 секунды он будет вызывать recvfrom()для извлечения данных из буфера сокета. Поскольку он находится в режиме NON -BLOCKING, функция recvfrom()немедленно вернется, если данные UDP недоступны, тогда я перейду в спящий режим на 4 секунды ).

Обратная связь/подтверждение UDP от всех клиентов имеет фиксированную полезную нагрузку размером 20 байт.

Теперь у меня есть два вопроса, связанных с этой реализацией:

  1. Правильно ли использовать один и тот же сокет для отправки/получения данных UDP? с несколькими клиентами?
  2. Как найти максимальное количество пакетов обратной связи/подтверждения UDP, которое может обрабатывать мое приложение без переполнения буфера сокета UDP (, так как я читаю каждые 4 секунды, если я получить много пакетов в течение этих 4 секунд Я могу потерять какой-то пакет, т.е. мне нужно найти скорость в пакетах/сек, с которой я могу безопасно справиться )?

Я попытался получить размер буфера сокета Linux для своего сокета (fdsocket). с помощью вызова функции getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);.Из этой функции я узнаю, что размер моего буфера сокета составляет 110592. Но мне не ясно, какие данные будут храниться в этом буфере сокета :, будет ли он хранить только полезную нагрузку UDP или весь пакет UDP или событие Весь пакет Ethernet? Я сослался на эту ссылку , чтобы получить некоторое представление, но запутался.

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

Ниже приведены ссылки, на которые я ссылался перед публикацией этого вопроса.

  1. Сеть Linux
  2. UDP SentTo и Recvfrom Максимальный размер буфера
  3. Обнаружение переполнения буфера сокета UDP
  4. Широковещательная и одноадресная рассылка UDP через один и тот же сокет?
  5. Отправка из одного сокета UDP в несколько потоков
  6. Как очистить входной буфер сокета UDP в C?
  7. Как узнать размер буфера сокета в Linux
  8. Как получить количество данных в очереди для сокета UDP?

6
задан user207421 13 September 2017 в 01:27
поделиться