Boost ASIO отбрасывает пакеты UDP

Я изменил функцию handle_send_to для BOOST ASIO. пример выглядеть так:

{   

ctr++;
cout<<"Counter: "<<ctr<<" data= "<<data<<endl;

socket_.async_receive_from(boost::asio::buffer(data_, max_length), sender_endpoint_,boost::bind(&server::handle_receive_from, this,boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred));

}

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

Тестовый клиент отправляет такие данные:

for(;;){
ctr++;
printf("ctr= %lu\n",ctr);
snprintf(buf2, 10,"%lu",ctr);
if ((numbytes = sendto(sockfd, buf2, strlen(buf2), 0,p->ai_addr, p->ai_addrlen)) == -1)   
{
perror("client: sendto");
exit(1);
}
}

После запуска тестового клиента я вижу на стороне сервера:

Counter= 358239 data= 369880

часть данных показывает сообщение #. Тестовый клиент действительно отправил 369880 сообщений, но, как вы можете видеть, счетчик составляет всего 358239 (удаление 11641 сообщения).

Что тут может быть не так?

Оба хоста (отправитель и получатель, работающие под управлением Ubuntu 10.04 LTS) в порядке с ресурсами — я не вижу перегрузки ЦП, памяти или сети.

Вывод netstat -su выглядит так:

Udp:
    38569571 packets received
    1003583 packets to unknown port received.
    74619 packet receive errors
    267 packets sent
    RcvbufErrors: 74619

Как устранить неполадки с большим количеством packets to unknown port received?


person user837208    schedule 12.01.2012    source источник


Ответы (1)


Учитывая, что вы в основном выполняете «бомбардировку насыщением» принимающего интерфейса, я ожидаю такого поведения, кроме того, нет гарантии, что UDP доставит данные, и вы также можете насытить свою сетевую карту. Карты Broadcom, например, имеют очень маленькие буферы отправки и приема, поэтому их настройка может быть полезной. Я бы предложил запустить netstat -anc | egrep "Recv|<port number>". И посмотрите, какой размер приемного буфера на принимающей стороне.

Если вы насытите буфер, вы начнете отбрасывать пакеты.

Что касается packets to unknown port, вам нужно будет выполнить tcpdump и проанализировать вывод с помощью WireShark или аналогичного инструмента, чтобы увидеть, что UDP трафик, который вы получаете в этой категории.

person Karlson    schedule 12.01.2012