Я пишу приложение C++ для Linux. В моем приложении есть сервер UDP, который отправляет данные клиентам о некоторых событиях. Сервер UDP также получает обратную связь/подтверждение от клиентов.
Для реализации этого приложения я использовал один сокет UDP (, например.int fdSocket
)отправлять и получать данные от всех клиентов. Я привязал этот сокет к порту 8080 и установил сокет в НЕБЛОКИРУЕМЫЙ _режим.
Я создал две темы. В одном потоке я жду, когда произойдет какое-то событие, и если событие происходит, я использую fdsocket для отправки данных всем клиентам (в цикле for ).
В другом потоке я использую fdSocket
для получения данных от клиентов(recvfrom()
). Этот поток планируется запускать каждые 4 секунды (, т. е. каждые 4 секунды он будет вызывать recvfrom()
для извлечения данных из буфера сокета. Поскольку он находится в режиме NON -BLOCKING, функция recvfrom()
немедленно вернется, если данные UDP недоступны, тогда я перейду в спящий режим на 4 секунды ).
Обратная связь/подтверждение UDP от всех клиентов имеет фиксированную полезную нагрузку размером 20 байт.
Теперь у меня есть два вопроса, связанных с этой реализацией:
Я попытался получить размер буфера сокета Linux для своего сокета (fdsocket
). с помощью вызова функции getsockopt(fdsocket,SOL_SOCKET,SO_RCVBUF,(void *)&n, &m);
.Из этой функции я узнаю, что размер моего буфера сокета составляет 110592. Но мне не ясно, какие данные будут храниться в этом буфере сокета :, будет ли он хранить только полезную нагрузку UDP или весь пакет UDP или событие Весь пакет Ethernet? Я сослался на эту ссылку , чтобы получить некоторое представление, но запутался.
В настоящее время мой код немного грязный, я скоро почищу и опубликую его здесь.
Ниже приведены ссылки, на которые я ссылался перед публикацией этого вопроса.