Boost ASIO 丢弃 UDP 数据包

use*_*208 5 sockets networking boost network-programming boost-asio

我已将BOOST ASIO 示例的 handle_send_to 函数修改 为如下所示-

{   

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));

}
Run Code Online (Sandbox Code Playgroud)

目的是基本上在每次处理 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);
}
}
Run Code Online (Sandbox Code Playgroud)

运行测试客户端后,我在服务器端看到:

Counter= 358239 data= 369880
Run Code Online (Sandbox Code Playgroud)

数据部分显示消息#。测试客户端确实发送了 369880 条消息,但正如您所看到的,计数器仅为 358239(丢弃了 11641 条消息)。

这里可能出了什么问题?

两台主机(发送方和接收方,运行 Ubuntu 10.04 LTS)的资源都很好 - 我没有看到 CPU、内存或网络饱和。

的输出netstat -su看起来像 -

Udp:
    38569571 packets received
    1003583 packets to unknown port received.
    74619 packet receive errors
    267 packets sent
    RcvbufErrors: 74619
Run Code Online (Sandbox Code Playgroud)

如何解决大量问题packets to unknown port received

Kar*_*son 3

考虑到您基本上是在对接收接口进行“饱和轰炸”,我预计会出现这样的行为,此外,无法保证 UDP 会传输数据,并且您的网卡也可能会饱和。例如,博通卡的发送和接收缓冲区非常小,因此调整这些缓冲区可能会很有用。我建议跑步netstat -anc | egrep "Recv|<port number>"。并查看接收端接收缓冲区的大小是多少。

如果缓冲区饱和,您将开始丢弃数据包。

至于packets to unknown port您需要使用WireSharktcpdump或类似工具分析输出,以查看您在该类别中收到的 UDP 流量。