【发布时间】:2015-11-16 18:43:13
【问题描述】:
我有一个非常简单的 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));
在 Windows 7 上使用 Visual Studio 2013 编译时,在 Ubuntu 14.04 ~100 MB/s 上的吞吐量约为 11 MB/s。我添加了计时器,并且能够验证 send(...) 方法是罪魁祸首。
我尝试过启用和不启用防病毒软件,并尝试禁用其他一些服务,但没有成功。由于计算机上的权限(例如防火墙),我无法禁用一些。
我假设在 Windows 上运行的服务会产生干扰,或者我的实现缺少一些影响 Windows 而不是 Linux 上的应用程序的东西。
任何关于可能导致这种情况的想法将不胜感激
【问题讨论】:
-
我假设您编译时使用了适当的优化?
-
是的,没有调试信息,/O2 /Ot
-
windows上的网卡设置怎么样?我不确定,但它可能没有为此用例优化设置
-
它们将是默认值,不确定它们应该设置为最佳多播发送
-
您是否尝试过不使用 boost 进行此操作?通过 Win32 API 直接调用?我假设您会看到相同的结果,但也许它是 boost 中的错误实现?