如何从任何 ip 和任何端口接收 UDP 数据包?

Posted

技术标签:

【中文标题】如何从任何 ip 和任何端口接收 UDP 数据包?【英文标题】:How to receive UDP packets from any ip and any port? 【发布时间】:2011-03-19 02:03:11 【问题描述】:

我想使用 C# 的 UdpClient 来监听任何传入的 UDP 数据包。我想从任何 IP 和任何端口接收数据包。

我尝试了以下方法:

UdpClient udpClient = new UdpClient(0);
IPEndPoint ep = new IPEndPoint(IPAddress.Any, 0);
byte[] data = udpClient.Receive(ref ep);

但没有成功。

有谁知道怎么回事? 提前致谢!

【问题讨论】:

很确定你不能像那样监听“每个”端口......也不明白你为什么想要。 @Fosco:网络嗅探器? @MPritch:那不是真正的 UDP。您正在监听原始以太网数据包。 Fosco 和 Steven Sudit(下)是正确的。您不能通过指定端口 0 来监听“每个”端口。系统会为您选择一个临时端口。您现在正在侦听您没有选择的端口上的 UDP 数据包,并且没有应用程序知道要发送到的端口。如果您正在发送 UDP 数据报,或者如果您有一个单独的通道(任何类型)用于将临时端口号发送到发送应用程序,则指定端口 0 并使用临时端口确实有意义。 回复:网络嗅探器? 那么这不是真正的 UDP。 -- 那就叫它 UDP Sniffer。 ;-D 【参考方案1】:

在任何端口上接收?这太疯狂了。您将被来自其他应用程序的消息淹没(尝试TcpView 了解每秒有多少消息通过您的系统!)

您必须指定一个端口!端口有点像一个标识符——这个数据包是为这个程序准备的(由端口号标识)

Send 在任何端口上都是明智的,因为它要求系统为您选择一个端口发送 OUT 端口——这对于您的应用程序来说并不像发送方有时那么重要

【讨论】:

以防万一,有正当理由想要这个。它可以在混杂模式下使用 RAW+UDP 套接字(并在管理员级别运行)。 如何在任何端口上接收“疯狂”,但在任何端口上 发送 并不疯狂?如果逻辑是端口识别数据包用于哪个程序,那将适用于发送和接收,对吧?【参考方案2】:

您最好的办法是确定您想监听的特定端口,然后开始监听这些端口。根据对接收到的数据报所做的处理,最好/最简单的方法是为您正在侦听的每个端口创建一个新的Thread,并在那里处理它,或者将其排入同步(使用lock)队列或列表中, 用于在中心线程上处理。

您应该限制端口;不可能全部听完。

也就是说,您可以使用 WiresharkWinpcap SDK/API 之类的东西直接从网络适配器“嗅探”UDP 数据包。我之前在 .NET 应用程序中使用过它,没有太多困难。

希望对您有所帮助。

【讨论】:

【参考方案3】:

你需要监听一个特定的端口。

通过传入零,您被分配了一个任意端口,因此您将只接收寻址到它的 UDP 数据报。换句话说,您将一无所获。

如果您确实收到了某些内容,IPEndPoint 将填写有关发件人的信息。初始值可用于约束发送者。

【讨论】:

以上是关于如何从任何 ip 和任何端口接收 UDP 数据包?的主要内容,如果未能解决你的问题,请参考以下文章

在一个应用程序中发送和接收 UDP 数据包

UDP和TCP的区别

如何从 udp-socket (C/C++) 获取您自己的(本地)IP 地址

如何通过 NAT 通过公共 IP 发送 UDP 数据包?

ICMP

四层发现-UDP发现