提升ASIO丢弃UDP数据包

时间:2012-01-12 20:36:43

标签: sockets networking boost network-programming boost-asio

我已将BOOST ASIO example的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));

}

目的是在每次处理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)都可以使用资源 - 我没有看到CPU,内存或网络饱和。

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 个答案:

答案 0 :(得分:2)

考虑到你基本上正在对接收接口进行“饱和度轰炸”,我会期望这样的行为,不能保证UDP会传送数据,你也可能会使网卡饱和。例如,Broadcom卡具有非常小的发送和接收缓冲区,因此调整这些缓冲区可能很有用。我建议运行netstat -anc | egrep "Recv|<port number>"。并查看接收缓冲区的大小在接收端。

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

packets to unknown port而言,您需要执行tcpdump并使用WireShark或类似工具分析输出,以查看您在该类别中接收的UDP流量。