我正在编写一个程序,使用 boost asio 从 Linux 中使用 c++ 的大约 30 个多案例 IP 接收多案例消息。我在这里寻求有关如何在运行时最小化客户端丢包的进展。我已经最大化了 NIC 接收缓冲区。我使用的是 8 核 CPU。我还想知道网卡会创建相同数量的缓冲区队列以等于程序中的套接字数量吗?除了配置网卡之外,我可以在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);
}
}