У меня очень простая оболочка для 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, я получаю пропускную способность ~ 11 МБ/с, на Ubuntu 14.04 ~ 100 МБ/с. Я добавил таймеры и смог проверить, что метод send(...)
является виновником.
Я попытался с включенным антивирусом и без него, и попытался отключить несколько других сервисов без везения. Некоторое я не могу отключить из-за разрешений на компьютере, например, брандмауэра.
Я предполагаю, что в среде Windows работает служба, которая мешает, или в моей реализации отсутствует то, что работает с приложением в Windows, а не Linux.
Любые идеи о том, что может быть с этим связано, будут оценены