2012-01-12 174 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流量輸出。