c – 在Windows上使用boost :: asio发送的组播性能差

前端之家收集整理的这篇文章主要介绍了c – 在Windows上使用boost :: asio发送的组播性能差前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个非常简单的包装器boost :: asio套接字发送多播消息:
// header
class MulticastSender
{
public:

    /// Constructor
    /// @param ip - The multicast address to broadcast on
    /// @param port - The multicast port to broadcast on
    MulticastSender(const String& ip,const UInt16 port);

    /// Sends a multicast message
    /// @param msg - The message to send
    /// @param size - The size of the message (in bytes)
    /// @return number of bytes sent
    size_t send(const void* msg,const size_t size);

private:

    boost::asio::io_service m_service;
    boost::asio::ip::udp::endpoint m_endpoint;
    boost::asio::ip::udp::socket m_socket;

};

// implementation
inline MulticastSender::MulticastSender(const String& ip,const UInt16 port) :
    m_endpoint(boost::asio::ip::address_v4::from_string(ip),port),m_socket(m_service,m_endpoint.protocol())
{
    m_socket.set_option(boost::asio::socket_base::send_buffer_size(8 * 1024 * 1024));
    m_socket.set_option(boost::asio::socket_base::broadcast(true));
    m_socket.set_option(boost::asio::socket_base::reuse_address(true));
}

inline size_t MulticastSender::send(const void* msg,const size_t size)
{
    try
    {
        return m_socket.send_to(boost::asio::buffer(msg,size),m_endpoint);
    }
    catch (const std::exception& e)
    {
        setError(e.what());
    }
    return 0;
}

// read and send a message
MulticastSender sender(ip,port);
while(readFile(&msg)) sender.send(&msg,sizeof(msg));

当使用Visual Studio 2013在Windows 7上编译时,我在Ubuntu 14.04〜100 MB / s时可以获得〜11 MB / s的吞吐量.我添加了计时器,并且能够验证发送(…)方法是罪魁祸首.

我尝试使用和不启用防病毒功能,并尝试禁用其他几项服务,没有运气.有些我无法通过计算机上的权限禁用,如防火墙.

我假设Windows上运行的服务是干扰的,或者我的实现缺少在Windows而不是Linux上影响应用程序的一些.

任何关于可能正在考虑的想法将不胜感激

解决方法

Windows和ubuntu是否在同一台机器上运行?

如果没有,似乎你的Windows机器受到100Mbit以太网的限制,而ubuntu机器似乎与1Gbit以太网一起使用.

(如果不是问题的原因,我很抱歉发布anwser而不是评论,但我不能这样做,你的代码是那么简单,数据速率是如此明显[11 * 8MB / s〜 100Mbit / s和100MB / s〜800Mbit / s],我只需要提示…)

猜你在找的C&C++相关文章