C ++ UDP сокеты очереди пакетов - PullRequest
4 голосов
/ 15 октября 2010

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

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

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

Ответы [ 3 ]

8 голосов
/ 15 октября 2010

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

1 голос
/ 15 октября 2010

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

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

1 голос
/ 15 октября 2010

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

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

...