【问题标题】:How can I pass the source IP in a UDP server using Boost ASIO如何使用 Boost ASIO 在 UDP 服务器中传递源 IP
【发布时间】:2010-08-02 09:19:36
【问题描述】:

我需要在我正在使用 boost ASIO 编写的 UDP 服务器中获取数据报的源 IP。 在示例 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,我需要能够回复该源数据包。

【问题讨论】:

  • 你能贴出你的server类的代码吗?
  • 目前它与异步 udp 服务器示例相同。

标签: boost-asio


【解决方案1】:

认为如果您在设置另一个异步处理程序之前访问处理程序中的 sender_endpoint_.address() ,它会很好并且不会被覆盖。您确实在处理程序中再次调用 async_receive_from ,对吧,准备接收另一个数据包?

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

【讨论】:

  • 谢谢,我确实弄清楚了,但这里没有添加任何内容。
  • UDP 有一个伪标头,其中封装了 IP 地址。我不知道如何通过 Boost.Asio 访问它。但是,port 是您需要了解的有关发件人的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多