Проблема с трансляцией с использованием Boost.Asio

Я заранее прошу прощения, если на вопрос уже был дан ответ, но я искал и не нашел ничего, что помогло бы мне. Как указано в заголовке вопроса, я пытаюсь передать пакет с сервера на группу клиентов, прослушивающих любое сообщение.

Клиент посчитает количество сообщений, полученных им в течение одной секунды.

Серверная сторона вещей выглядит так:

class Server
{
public:

    Server(boost::asio::io_service& io)
        : socket(io, udp::endpoint(udp::v4(), 8888))
        , broadcastEndpoint(address_v4::broadcast(), 8888)
        , tickHandler(boost::bind(&Server::Tick, this, boost::asio::placeholders::error))
        , timer(io, boost::posix_time::milliseconds(20))
    {
        socket.set_option(boost::asio::socket_base::reuse_address(true));
        socket.set_option(boost::asio::socket_base::broadcast(true));

        timer.async_wait(tickHandler);
    }

private:

    void Tick(const boost::system::error_code&)
    {
        socket.send_to(boost::asio::buffer(buffer), broadcastEndpoint);

        timer.expires_at(timer.expires_at() + boost::posix_time::milliseconds(20));
        timer.async_wait(tickHandler);
    }

private:

    udp::socket socket;
    udp::endpoint broadcastEndpoint;

    boost::function<void(const boost::system::error_code&)> tickHandler;
    boost::asio::deadline_timer timer;

    boost::array<char, 100> buffer;

};

Он инициализируется и запускается следующим образом:

int main()
{
    try
    {
        boost::asio::io_service io;
        Server server(io);
        io.run();
    }
    catch (const std::exception& e)
    {
        std::cerr << e.what() << "\n";
    }

    return 0;
}

Это (по-видимому) работает отлично. Теперь приходит клиент ...

void HandleReceive(const boost::system::error_code&, std::size_t bytes)
{
    std::cout << "Got " << bytes << " bytes\n";
}

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        std::cerr << "Usage: " << argv[0] << " <host>\n";
        return 1;
    }

    try
    {
        boost::asio::io_service io;

        udp::resolver resolver(io);
        udp::resolver::query query(udp::v4(), argv[1], "1666");

        udp::endpoint serverEndpoint = *resolver.resolve(query);
        //std::cout << serverEndpoint.address() << "\n";

        udp::socket socket(io);
        socket.open(udp::v4());

        socket.bind(serverEndpoint);

        udp::endpoint senderEndpoint;
        boost::array<char, 300> buffer;

        auto counter = 0;
        auto start = std::chrono::system_clock::now();

        while (true)
        {
            socket.receive_from(boost::asio::buffer(buffer), senderEndpoint);
            ++counter;

            auto current = std::chrono::system_clock::now();
            if (current - start >= std::chrono::seconds(1))
            {
                std::cout << counter << "\n";

                counter = 0;
                start = current;
            }
        }
    }
    catch (const std::exception& e)
    {
        std::cerr << e.what() << "\n";
    }

Это работает, когда сервер и клиент работают на одном компьютере, но не работает, когда сервер запускается на компьютере, отличном от того, на котором я запускаю клиент.

Во-первых, мне кажется странным, что я должен разрешить адрес сервера. Возможно, я не знаю, как на самом деле работает широковещание, но я думал, что сервер отправит сообщение, используя свой сокет с включенной опцией широковещания, и он прибудет ко всем сокетам в одной сети.

Я читал, что вы должны привязать сокет клиента кaddress_v4::any() адрес. Я сделал, это не работает (говорит что-то о сокете, уже использующем адрес / порт).

Заранее спасибо.

PS: я под Windows 8.

Ответы на вопрос(1)

Ваш ответ на вопрос