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

3

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

我尝试了以下方法:

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

但是没有成功。

有人知道出了什么问题吗? 提前感谢!


很确定你不能像那样监听“每个”端口……也不知道为什么你会想这样做。 - Fosco
1
@Fosco:网络嗅探器? - MPritchard
1
@MPritch:那这就不是真正的UDP了。你将会监听原始以太网数据包。 - Steven Sudit
Fosco和Steven Sudit(以下)是正确的。您无法通过指定端口0来监听“每个”端口。发生的情况是系统为您选择了一个临时端口。现在,您正在侦听未选择的UDP数据包端口,没有应用程序知道要发送到哪里。如果您正在发送UDP数据报文或具有用于向发送应用程序发送临时端口号的单独通道,则指定端口0并使用临时端口是有意义的。 - Peter Schaeffer
1
回复:网络嗅探器?那就不是真正的UDP了。-- 那就称它为UDP嗅探器吧。;-D - Jesse Chisholm
3个回答

6

在任何端口上都接收信息?这太疯狂了。你会被其他应用程序的消息淹没(尝试使用TcpView来了解每秒在您的系统上传递的消息数量!)

你必须指定一个端口!端口有点像标识符--这个数据包是为这个程序(通过端口号标识)而设计的。

在任何端口上发送是合理的,因为它要求系统为你选择一个发送OUT端口--这对于发送方有时并不是非常重要。


3
无论什么情况,都有合法的理由想要这样做。使用原始套接字+UDP在混杂模式下(以管理员权限运行),是可行的。 - Jesse Chisholm
1
接收任何端口的数据是“疯狂”的,但在任何端口发送数据却不是“疯狂”的,这为什么?如果逻辑是端口标识数据包所针对的程序,那么这应该适用于发送和接收,对吧? - Mud
@Mud 不完全是这样。让我们用一个简单的例子来说明,假设你要从两个数据库服务器接收通信。你希望从这两台服务器接收数据,并且端口可以识别它们分别属于哪一台服务器。你并不关心数据是从各自的服务器的哪些端口发送出去的,这不是你所关心的。你只需要确保正确的端口接收到数据即可。 - The Betpet
我的观点是,机器在每个端口接收数据并不是“疯狂”的,因为事实上它已经这样做了。端口只是控制将这些数据包从网络层路由到应用层的方式。 - Mud

5
您最好的想法是确定您想要监听的特定端口,并开始在这些端口上进行监听。根据接收到的数据报的处理方式,为每个正在侦听的端口创建一个新的Thread进行处理可能是最好/最简单的选择,或者将其排队在同步(使用lock)队列或列表上,以供中央线程处理。
但您应该限制端口的数量;不可能全部监听。
话虽如此,您可以使用类似于WiresharkWinpcap SDK / API的工具从网络适配器“嗅探”UDP数据包。我之前在.NET应用程序中也成功实现过这一点,没有遇到太多困难。
希望这有所帮助。

4

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

如果传入零,将会分配一个任意的端口,因此您只会收到发送至该端口的UDP数据包。换句话说,您将什么都不会收到。

如果您确实收到了一些内容,IPEndPoint将填充有关发送方的信息。初始值可用于约束发送方。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接