0

我正在编写一个程序,使用 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);
    }
}
4

1 回答 1

0

丢包问题是由硬件引起的,包括交换机和网卡。数据包速率实际上是 2500 * 70 /sec,因为有 70 个 udp 套接字。强烈推荐一个名为 Wireshark 的网络监控工具,它提供有关您当前网络流量的大量信息。

关于Demon的解决方案,boost asio在window下使用iocp,在unix下使用epoll。

也不需要调整缓冲区大小。

于 2013-01-18T01:23:52.470 回答