我正在使用boost asio编写一个程序,用c ++接收来自Linux中大约30个multicase ip的多酶消息。我在这里寻求在运行时如何最小化来自客户端的数据包丢失的进展。我已经最大化了NIC接收缓冲区。我使用的是8核CPU。我也想知道NIC卡会创建相同数量的缓冲队列,等于程序中的套接字数吗?除了配置NIC卡,我可以在linux内核上做点什么吗?因为我相信内核会先从我们的程序复制数据之前从NIC做缓冲区复制,对吗?
template<typename msg, int id>
void data_service<msg, id>::on_rt_recv( char* p_raw_packet, int p_length, const boost::system::error_code& error )
{
if (!error)
{
//post to strand and wait to proceed
processing_strand_.post(boost::bind(&data_service::on_rt_recv_handler, this,
p_raw_packet,
p_length));
//continue to listen as soon as possible
auto new_buffer = get_new_buffer();
rt_socket_[p_line]->async_receive_from(boost::asio::buffer(new_buffer, BUFFER_SIZE_), rt_endpoint_,
boost::bind(&data_service::on_rt_recv, this,
new_buffer,
boost::asio::placeholders::bytes_transferred,
boost::asio::placeholders::error));
}
else if (error != boost::asio::error::operation_aborted)
{
memory_pool_.free((void*)p_raw_packet);
}
}
答案 0 :(得分:0)
数据包丢失问题是由硬件引起的,包括交换机和NIC卡。数据包速率实际上是2500 * 70 /秒,因为有70个udp套接字。强烈建议使用网络监控工具调用Wireshark,它提供有关当前网络流量的大量信息。
关于Demon解决方案,Boost asio在钩子下使用窗口中的iocp和unix中的epoll。
也不需要调整缓冲区大小。