Я отправляю UDP-пакеты с локального хоста на локальный и запускаю пакеты, иногда сбрасываемые.Как мне это остановить и почему это происходит? - PullRequest
7 голосов
/ 16 декабря 2011

Это вывод из моей программы

sending agent update
Created new player
Identified
sending agent update
Physics: 2 ticks this frame
time= 200
time= 300
***Packet Dropped: 2:10 ***
***Packet Dropped: 2:11 ***
***Packet Dropped: 2:12 ***
***Packet Dropped: 2:13 ***
***Packet Dropped: 2:14 ***
***Packet Dropped: 2:15 ***
***Packet Dropped: 2:16 ***
***Packet Dropped: 2:17 ***
***Packet Dropped: 2:18 ***
***Packet Dropped: 2:19 ***
***Packet Dropped: 2:20 ***
***Packet Dropped: 2:21 ***
time= 400
Physics: 2 ticks this frame
time= 500
Physics: 2 ticks this frame

Отправка пакетов с локального хоста на локальный хост, пакеты отбрасываются.Это происходит только в начале.Первые 10 или около того пакетов проходят, затем пакеты после этого отбрасываются.От 5 до 40 пакетов подряд.Затем пакеты перестают отбрасываться.

Есть ли причина, по которой это должно произойти?

Обновление:

Следующий код устранил проблему.

int buffsize = 65536; // 65536
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, (void*)&buffsize, sizeof(buffsize));

Я отправлял пакеты слишком быстро и превысил буфер приема Windows по умолчанию, который составляет всего 8 КБ.Увеличение размера буфера устранило проблему.

Ответы [ 3 ]

8 голосов
/ 16 декабря 2011

Проверьте размер буфера UDP, настроенный по умолчанию в вашей ОС.

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

int buffer_size = 4 * 1024 * 1024 ;
setsockopt(socket, SOL_SOCKET, SO_RCVBUF, &buffer_size, sizeof(buffer_size));

Вы можете найти ЭТУ ссылку довольно полезной.

4 голосов
/ 16 декабря 2011

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

1 голос
/ 16 декабря 2011

Как очень быстро догадаться - в прошлом я видел это, потому что окна приема переполнены. По сути, ваше приложение не использует пакеты достаточно быстро, а ядру отведено только столько места - вам нужно увеличить параметр rwin. Или, с другой стороны, вы отправляете их слишком быстро - параметры в окне Linux:

net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096
...