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

时间:2014-02-20 15:37:16

标签: c++ boost boost-asio

Boost.Asio的udp::endpoint有一个远程地址的成员。因为我正在监听多个接口(如下所示):

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

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

如果没有迭代网络接口并在每个接口上查找端点地址和我的IP之间的相似性,我可以获取我从其获得消息的接口的IP吗?

3 个答案:

答案 0 :(得分:7)

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

socket::aync_receive_from()socket::receive_from()操作在boost::asio::detail::socket_ops::recvfrom()内执行本机套接字操作。在Windows上,WSARecvFrom()无法从协议堆栈中提取较低层信息。在Linux上,IP_PKTINFO套接字选项可以提供给面向数据报的套接字,使recvfrom()能够使用辅助信息填充msghdr.msg_control缓冲区,例如接收数据包的接口索引和目标包头中的地址。但是,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()
  • 将套接字明确绑定到每个接口而不是INADDR_ANY,从而导致socket::local_endpoint()返回特定接口。完成处理程序需要一些方法来获取调用操作的套接字上的本地端点,例如通过boost::bind()传递对套接字或其本地端点的引用。

答案 1 :(得分:2)

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

因此,如果socket是重新获取msg的套接字,那么你应该能够通过

获取处理程序中的ip。
socket.local_endpoint().address()

请参阅加速手册中的local_endpoint()address()

答案 2 :(得分:2)

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

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

这样您就可以使用udp_socket.local_endpoint().address()来获取IP。