Плохая передача многоадресной рассылки с использованием boost:: asio в Windows

У меня очень простая оболочка для 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.

Любые идеи о том, что может быть с этим связано, будут оценены

Ответ 1

Являются ли окна и ubuntu запущенными на одном компьютере?

Если нет, кажется, что ваша машина Windows ограничена 100-мегабитным Ethernet, а машина ubuntu работает с 1Gbit Ethernet.

(В случае, если это не причина проблемы, я извиняюсь за публикацию anwser вместо комментариев. Но я не могу этого сделать, и ваш код настолько прост, и скорость передачи данных настолько очевидна [11 * 8 МБ /s ~ 100 Мбит/с и 100 Мбайт/с ~ 800 Мбит/с]. Мне просто нужно было сделать этот намек...)

Ответ 2

Если вы передаете данные, если громко говорите больше, чем 10 МБ сообщений, я предлагаю вам использовать TCP вместо UPD/Multicast. TCP - надежный протокол.

Я читал в случае, где поток из 300 байтовых пакетов отправлялся по Ethernet (1500 байтов MTU), а TCP был на 50% быстрее, чем UDP. Поскольку TCP будет пытаться буферизовать данные и заполнять полный сегмент сети, тем самым более эффективно использовать доступную полосу пропускания, но UDP автоматически помещает пакет в провод, таким образом, забивая сеть множеством небольших пакетов. В Windows я предлагаю вам использовать TCP через UDP/Multicast.