如何使用Boost ASIO在UDP服务器中传递源IP

时间:2010-08-02 09:19:37

标签: boost-asio

我需要在UDP服务器中获取数据报的源IP,我正在使用boost ASIO编写。 在示例udp数据报服务器中行:

注意:我当前的代码与boost asio文档中的现有udp异步服务器示例相同。

 socket_.async_receive_from(
        boost::asio::buffer(data_, max_length), sender_endpoint_,
        boost::bind(&server::handle_receive_from, this,
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred));

传递错误和bytes_transferred。我还需要消息的地址。

现在我知道我可以直接使用sender_endpoint_.address()。to_string(),但是我 我想将此作为参数传递。

所以我尝试将sender_endpoint_.address()作为参数放入。 即。

socket_.async_receive_from(
        boost::asio::buffer(data_, MAX_LENGTH), sender_endpoint_,
        boost::bind(&server::handle_receive_from, this,
          boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred,
                    sender_endpoint_.address()));

但是从handle_receive_from读取时结果是0.0.0.0。 但是,如果我只是访问handle_receive_from中的sender_endpoint_.address() 我得到127.0.0.1这是正确的。

如何正确传递?我需要这个,因为有多个线程调用io_service.run(),所以来自另一个源的数据包可能会覆盖sender_endpoint,我需要能够回复该源数据包。

1 个答案:

答案 0 :(得分:0)

认为如果你在设置另一个异步处理程序之前访问处理程序中的sender_endpoint_.address(),那么它将没有问题,也不会被覆盖。您可以在处理程序中再次调用async_receive_from,然后准备接收另一个数据包吗?

在第二个代码块中,您尝试将sender_endpoint_.address()作为参数,在设置处理程序时调用sender_endpoint_.address(),而不是在收到数据包时由处理程序执行。这就是为什么它总是0.0.0.0。