我需要在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,我需要能够回复该源数据包。
答案 0 :(得分:0)
我认为如果你在设置另一个异步处理程序之前访问处理程序中的sender_endpoint_.address(),那么它将没有问题,也不会被覆盖。您可以在处理程序中再次调用async_receive_from,然后准备接收另一个数据包吗?
在第二个代码块中,您尝试将sender_endpoint_.address()作为参数,在设置处理程序时调用sender_endpoint_.address(),而不是在收到数据包时由处理程序执行。这就是为什么它总是0.0.0.0。