如何从活动的udp连接中获取远程IP地址和端口?

How to get remote ip address and port from active udp connection?

提问人:Jonathan 提问时间:4/9/2019 更新时间:4/10/2019 访问量:2160

问:

我正在开发一个图形化 Windows 应用程序。因此,首选 c++ 和 c# 解决方案。

对于我的应用程序,我需要从特定进程的活动 udp 连接中获取远程地址和端口。

我尝试了 API,但 UDP 的方法没有给出远程地址和端口。IP Helper

我已经看到这些帖子获取活动 udp 连接的目标 IP/端口?使用 IP Helper 在 Windows 中获取活动 UDP 连接的远程地址

我理解为什么 IP Helper 无法完成这项工作(udp 是无连接的,需要捕获数据包),但我没有发现具体如何做到这一点。

您是否有现成的解决方案或接近它的解决方案?

C# C++ WinAPI UDP iphelper

评论

0赞 jdweng 4/9/2019
您在使用广播吗?广播没有远程 IP 地址?UDP 有两种类型。无连接广播和具有连接的非广播。
0赞 super 4/9/2019
通常,使用 UDP,您可以获得远程地址和端口以及收到的每个数据包。
2赞 SergeyA 4/9/2019
没有 UDP 连接这样的东西。重新思考您的设计。
0赞 molbdnilo 4/9/2019
正如您自己所说,UDP 是一种无连接协议。这意味着没有“活动连接”。
1赞 Remy Lebeau 4/10/2019
@jdweng “UDP 有两种类型。无连接广播和具有连接的非广播“ - 不正确。所有 UDP 流量都是无连接的,无论是否广播。

答:

1赞 Remy Lebeau 4/10/2019 #1

正如您已经发现的那样,UDP 是无连接的,因此操作系统不会像 TCP 那样跟踪远程参与方信息。与 TCP 套接字不同,UDP 套接字可以同时与多个远程方通信,其中指定目标 IP/端口,并报告发送方的 IP/端口。sendto()recvfrom()

我理解为什么 IP Helper 无法完成这项工作(udp 是无连接的,需要捕获数据包),但我没有发现具体如何做到这一点。

您需要使用数据包捕获库(例如 libpcap),并手动跟踪您看到的传出数据包的 ips/端口。

评论

0赞 capveg 9/1/2023
这个回答并不完全正确。如果应用程序为 UDP 套接字调用 connect(),则 OS 跟踪连接。这在实践中会发生:''' netstat -ap udp |grep -v '*:*' 活动连接 原始本地地址 外部地址状态 UDP 0.0.0.0:49775 0.0.0.95:443 UDP 0.0.0.0:50146 0.0.32.3:443 UDP 0.0.0.0:56207 0.0.0.101:443 UDP 0.0.0.0:58457 0.0.0.95:443 UDP 0.0.0.0:59344 0.0.0.95:443 UDP 0.0.0.0:61905 0.0.0.2:443 ''' 我们如何获取此信息?
0赞 Remy Lebeau 9/1/2023
@capveg是的,您可以使用(即启用该套接字的使用)将对等 IP/端口静态分配给 UDP 套接字,并且您可以使用从“ed UDP 套接字”中检索对等 IP/端口,但 AFAIK 没有 API 允许您从操作系统的路由表外部获取相同的对等信息, 因为对于 UDP,它们只报告本地绑定的 IP/端口,而不报告对等 IP/端口。connect()send()recv()getpeername()connect
0赞 capveg 9/3/2023
有关详细信息,请参阅 stackoverflow.com/questions/77029015/...,但“netstat -a p udp”输出远程 IP 的值 + UDP 端口...我只是想了解它们来自哪里(以及为什么它们有问题)。