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

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

Для реализации этого приложения я использовал один сокет UDP (например,int fdSocket) отправлять и получать данные от всех клиентов. Я привязал его к порту 8080 и перевел сокет в режим NON_BLOCKING.

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

В другой теме я используюfdSocket получать данные от клиентов (recvfrom()). Этот поток планируется запускать каждые 4 секунды (то есть каждые 4 секунды он будет вызыватьrecvfrom() получить данные из буфера сокета. Поскольку он находится в режиме НЕБЛОКИРОВКИ,recvfrom() Функция немедленно вернется, если нет данных UDP, тогда я пойду спать на 4 секунды).

UDP Feedback / Acknowledge от всех клиентов имеет фиксированную полезную нагрузку, размер которой составляет 20 байтов.

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

Is it correct to use the same socket for sending/receiving UDP data with Mulitiple clients ? How to find the maximum number of UDP Feedback/Acknowledge Packets my application can handling without UDP Socket Buffer Overflow (since I am reading at every 4secs, if I receive lot of packets within this 4 seconds I might loose some packet ie., I need to find the rate in packets/sec I can handle safely)?

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

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

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

Linux Networking UDP SentTo and Recvfrom Max Buffer Size UDP Socket Buffer Overflow Detection UDP broadcast and unicast through the same socket? Sending from the same UDP socket in multiple threads How to flush Input Buffer of an UDP Socket in C? How to find the socket buffer size of linux How do I get amount of queued data for UDP socket?

Ответы на вопрос(3)

Ваш ответ на вопрос