Очередь пакетов сокетов UDP в C ++

Я использую один и тот же сокет UDP для отправки и получения данных. Мне интересно, существует ли уже очередь пакетов для сокетов DGRAM, или мы должны обрабатывать ее отдельно.

Если код пользователя должен обрабатывать очередь, как это делается? Есть ли у нас отдельные потоки для recvfrom для сокета и помещения пакета в reciver_queue и для отправки из другой send_queue?

Пример кода будет просто потрясающим. Спасибо за вашу помощь.


person SkypeMeSM    schedule 15.10.2010    source источник
comment
как я могу узнать адрес получателя пакета udp, когда я использую recvfrom (stackoverflow.com/questions/3940612/) ??   -  person SkypeMeSM    schedule 15.10.2010


Ответы (3)


Есть очередь пакетов. Однако, когда очередь пакетов заполнена, пакеты UDP начинают отбрасываться. Когда они выбрасываются, они теряются навсегда, поэтому обязательно продолжайте читать данные!

person Goz    schedule 15.10.2010
comment
+1: обратите внимание, что даже если вы читаете достаточно быстро, получение кадров UDP не гарантируется (в правильном порядке или вообще), поэтому будьте готовы к потере данных. - person ereOn; 15.10.2010

Как заметил Гоз, есть очередь пакетов. На самом деле существует более одного в разных местах всего конвейера, который заканчивается в вашем приложении. Обычно на сетевой карте есть несколько буферов, а некоторые управляются ядром. Размер буферов ядра часто можно изменить для отдельных сокетов с помощью setsockopt ().

Как уже отмечал Гоз, UDP-пакеты могут быть потеряны на пути к вам, или они могут приходить в другом порядке. Если вам нужна как надежность, так и порядок, и если вы не можете использовать вместо этого TCP, вам придется реализовать какой-то протокол, который будет предоставлять оба поверх UDP, например протокол скользящего окна.

person wilx    schedule 15.10.2010

В UDP фактически есть только буфер приемного сокета. Хотя есть опция сокета SO_SNDBUF, предоставленное значение является только верхним пределом для размера дейтаграммы. Исходящая дейтаграмма либо передается оборудованию целиком, либо фрагментами (если она больше, чем MTU), либо отбрасывается. Аппаратное обеспечение обычно имеет несколько кольцевых буферов, но это действительно связано с DMA и не имеет отношения к приложениям пользовательского уровня.

Самый простой способ организации очереди пакетов в приложении - это, опять же, кольцевой буфер - сделайте его большим Достаточно для нормального использования, потеряйте несколько пакетов во время сильных всплесков. Наверняка есть и другие подходы.

person Nikolai Fetissov    schedule 15.10.2010