Повышение ASIO отбрасывания пакетов UDP - PullRequest
4 голосов
/ 13 января 2012

Я изменил функцию 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?

1 Ответ

2 голосов
/ 13 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...