簡體   English   中英

如何在 Boost.Asio 中通過 IP 多播實現客戶端-服務器架構?

[英]How to implement client-server architecture over IP multicast in Boost.Asio?

我正在嘗試使用 Boost.Asio 實現雙向多播 UDP 通信。 實際上我需要的是客戶端-服務器架構。

我使用了這些教程和示例並對其進行了修改:

https://www.boost.org/doc/libs/1_71_0/doc/html/boost_asio/example/cpp11/multicast/receiver.cpp

https://www.boost.org/doc/libs/1_71_0/doc/html/boost_asio/example/cpp11/multicast/sender.cpp

https://www.boost.org/doc/libs/1_71_0/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp

https://www.boost.org/doc/libs/1_71_0/doc/html/boost_asio/tutorial/tutdaytime6.html

Futures 白天客戶端和白天服務器工作得很好,除非我使用多播地址,這是我必須的。 它只是不溝通。

我將客戶端的 daytime 函數和服務器示例的構造函數修改為如下所示:

客戶:

    void get_daytime(boost::asio::io_context& io_context,
                 const boost::asio::ip::address& listenAddress,
                 const boost::asio::ip::address& multicastAddress)
{
    try
    {
        udp::socket socket(io_context);

        boost::asio::ip::udp::endpoint listenEndpoint(listenAddress, multicastPort);
        socket.open(listenEndpoint.protocol());
        socket.set_option(boost::asio::ip::udp::socket::reuse_address(true));
        socket.bind(listenEndpoint);
        socket.set_option(boost::asio::ip::multicast::join_group(multicastAddress));


        std::array<char, 1U> send_buf  = {{ 0 }};
        std::future<std::size_t> send_length =
                socket.async_send_to(boost::asio::buffer(send_buf),
                                     listenEndpoint,
                                     boost::asio::use_future);

        send_length.get();

        std::array<char, 128U> recv_buf{};
        udp::endpoint sender_endpoint;
        std::future<std::size_t> recv_length =
                socket.async_receive_from(
                        boost::asio::buffer(recv_buf),
                        sender_endpoint,
                        boost::asio::use_future);

        std::cout.write(
                recv_buf.data(),
                recv_length.get()); // Blocks until receive is complete.
    }
    catch (std::system_error& e)
    {
        std::cerr << e.what() << std::endl;
    }
}

服務器:

udp_server(boost::asio::io_context& io_context,
               const boost::asio::ip::address& listenAddress,
               const boost::asio::ip::address_v4& multicastAddress)
               : socket_(io_context)
    {
        boost::asio::ip::udp::endpoint listenEndpoint(listenAddress, multicastPort);
        socket_.open(listenEndpoint.protocol());
        socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true));
        socket_.bind(listenEndpoint);
        socket_.set_option(boost::asio::ip::multicast::join_group(multicastAddress));
        start_receive();
    }

我應該如何修改代碼以使其通過多播工作? 謝謝。

我找到了解決我的問題的方法。 我不必修改 getDaytime() 函數,盡管我的 udp_server() 構造函數現在看起來像這樣:

udp_server(boost::asio::io_context& io_context)
            : socket_(io_context, udp::endpoint(boost::asio::ip::make_address("0.0.0.0"), 60000))
    {
        socket_.set_option(boost::asio::ip::multicast::join_group(boost::asio::ip::make_address("239.192.0.1")));
        start_receive();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM