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_PKTINFO
和recvfrom()
) - 将套接字显式绑定(bind)到每个接口(interface)而不是
INADDR_ANY
,导致socket::local_endpoint()
返回一个特定的接口(interface)。完成处理程序将需要一些方法来获取调用操作的套接字上的本地端点,例如通过boost::bind()
传递对套接字或其本地端点的引用。
关于c++ - 如何从 udp 端点获取 *my* ip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21912461/