如何从udp端点获取*my*ip
How to get *my* ip from udp endpoint
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_PKTINFO
和recvfrom()
) - 将套接字显式绑定到每个接口,而不是
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。
相关文章:
- 我正在开发服务器,ip作为参数传递不起作用
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- 从网址获取 IP (C++)
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?
- 如何修复无效的API密钥,IP或操作权限错误?
- C++ Winsock2 客户端未通过远程 IP 连接到服务器
- PHP Profiler语言 - 使用 C++ 从 PHP 扩展获取客户端 IP 和 URL
- 为什么 boost::asio::ip::tcp::basic_stream_socket::available 的运行
- 如何使用 libcurl 在本地 IP 上获取 HTML?
- 在反转字符串'my.name.is'时,我得到的输出为"is@.name.my"。我不明白'@'是从哪里来的
- My Project的属性配置正确,但Visual Studio仍然无法打开包含头文件
- 在C++中使用宏验证 IP 时出错
- 使用 IP 帮助程序的 Windows 中活动 UDP 连接的远程地址
- 将静态 IP 分配给我的 ESP32 服务器后不再响应
- C++ / Qt:如何检测主机名或IP地址何时引用当前系统?
- "acceptor"在从TCP迁移到UDP时不是"boost::asio::ip::udp
- 用于C++的 TCP/IP 解析器和响应器
- 如何从udp端点获取*my*ip