多播接收器程序的优化

时间:2013-01-09 16:25:15

标签: c++ linux boost boost-asio multicast

我正在使用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);
    }
}

1 个答案:

答案 0 :(得分:0)

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

关于Demon解决方案,Boost asio在钩子下使用窗口中的iocp和unix中的epoll。

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