2012-01-12 171 views
2

我修改的BOOST ASIO example handle_send_to功能看起来像这 -升压ASIO丢弃UDP数据包

{ 

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

回答

2

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

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

至于packets to unknown port你需要做一个tcpdump和分析使用WireShark或类似的工具来查看您该类别正在接受什么样的UDP流量输出。