c++ - 如何从 udp 端点获取 *my* ip

标签 c++ boost boost-asio

Boost.Asio 的udp::endpoint 有一个成员是远程地址。因为我在多个接口(interface)上监听(像这样):

udp_socket(io_service, udp::endpoint(udp::v4(), port))

在我的处理程序中,我不知道哪个网络接口(interface)收到了数据包。

如果不遍历网络接口(interface)并在每个接口(interface)上寻找端点地址和我的 IP 之间的相似性,我能否获得我从中获取消息的接口(interface)的 IP?

最佳答案

没有。 Boost.Asio 不提供识别数据报目标地址的能力。

socket::aync_receive_from()socket::receive_from()操作在 boost::asio::detail::socket_ops::recvfrom() 内执行 native 套接字操作.在 Windows 上,WSARecvFrom()不提供从协议(protocol)栈中提取低层信息的方法。在 Linux 上,IP_PKTINFO套接字选项可以提供给面向数据报的套接字启用 recvfrom()用辅助信息填充 msghdr.msg_control 缓冲区,例如接收数据包的接口(interface)索引和数据包 header 中的目标地址。然而,Boost.Asio implementation不使用 msg_control 字段:

msghdr msg = msghdr();
init_msghdr_msg_name(msg.msg_name, addr);
msg.msg_namelen = static_cast<int>(*addrlen);
msg.msg_iov = bufs;
msg.msg_iovlen = static_cast<int>(count);
signed_size_type result = error_wrapper(::recvmsg(s, &msg, flags), ec);

this 中的建议答案,一个可以:

  • 使用较低级别的系统调用。 (即 IP_PKTINFOrecvfrom())
  • 将套接字显式绑定(bind)到每个接口(interface)而不是 INADDR_ANY,导致 socket::local_endpoint()返回一个特定的接口(interface)。完成处理程序将需要一些方法来获取调用操作的套接字上的本地端点,例如通过 boost::bind() 传递对套接字或其本地端点的引用。

关于c++ - 如何从 udp 端点获取 *my* ip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21912461/

相关文章:

C++派生类和虚析构函数

c++ - 重载基类函数

c++ - 哪些 boost 库正在走向 TR2?

c++ - boost 找不到文件

c++ - Boost、asio、https 和主机/证书验证

c++ - 在多线程程序中使用多个async_wait

c++ - C++中的无穷范函数

c++ - 在 if 语句中使用 != 运算符来检查两个条件

c++ - 如何在std算法中使用unique_ptr的transform_iterator

c++ - 错误 C2248 无法访问类 'boost::asio::basic_io_object<IoObjectService> 中声明的私有(private)成员