如何从udp端点获取*my*ip

How to get *my* ip from udp endpoint

本文关键字:my ip 获取 端点 udp      更新时间:2023-10-16

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

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

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

如果不在网络接口上迭代,也不在每个接口上查找端点地址和我的IP之间的相似性,我可以获得我收到消息的接口的IP吗?

否。Asio不公开识别数据报目的地址的能力。

CCD_ 2和CCD_ 3操作执行CCD_。在Windows上,WSARecvFrom()无法从协议栈中提取较低层的信息。在Linux上,IP_PKTINFO套接字选项可以提供给面向数据报的套接字,使recvfrom()能够用辅助信息填充msghdr.msg_control缓冲区,例如接收数据包的接口索引和数据包标头中的目的地地址。然而,Boost.Asio实现不使用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);

正如这个答案中所建议的,可以:

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

据我所知,您有不同的boost::asio::ip::udp::sockets。如果其中一个收到消息,您想知道该套接字的本地ip地址/套接字使用的接口。

因此,如果socket是接收消息的套接字,那么您应该能够通过在处理程序中获取ip

socket.local_endpoint().address()

请参阅boost手册中的local_endpoint()和address()。

我认为您应该明确指定地址,而不是简单地指定协议

udp_socket(io_service, udp::endpoint(boost::asio::ip::address::from_string(""), port))

以便您可以使用udp_socket.local_endpoint().address()来获取ip。