当前位置: 首页 > 知识库问答 >
问题:

接收 UDP 数据包时,端口与侦听端口不匹配

濮阳茂材
2023-03-14

这不是问题,而是好奇心。我使用 UDP 创建了一个简单的发送/接收 C# 应用程序,主要遵循 UdpClient 上的 MSDN 示例。我有一个文本框作为发送或接收内容的日志;它打印时间戳以及从何处发送/接收的内容。

好奇心来自端口号。当程序侦听某个端口并收到数据包时,收到的数据包上的端口与它正在侦听的端口不匹配。

例如,这是应用程序的屏幕截图(注意:即使使用不同的计算机发送/接收,这种情况仍然会发生):

它接收到的数据包很好,这就是为什么这不是一个真正的“问题”,因为它正在工作。我只是好奇为什么接收到的数据包上的端口显示与它正在侦听的端口不同。我想知道这是否只是垃圾数据?

这是接收到数据时运行的代码(使用我从MSDN获得的AsyncCallback):

private void ReceiveCallback(IAsyncResult ar)
{
    try {
        // Pull the socket from the AsyncResult parameter
        UdpState state = (UdpState)(ar.AsyncState);
        UdpClient udp = state.udp;
        IPEndPoint end = state.endpoint;

        // Grab and convert the message into a string
        byte[] recvBytes = udp.EndReceive(ar, ref end);
        string recvString = Encoding.ASCII.GetString(recvBytes);

        /* Here's where it's logging the IPEndPoint onto the console.
         * Is the port meaningless when receiving a packet, and that's why it's
         * always something random? Or is there some meaning to it that I'm
         * unaware of? */
        ConsoleLog(end.ToString() + " Recv: " + recvString);

        // Start the listen cycle again so this will be called again
        listener.BeginReceive(new AsyncCallback(ReceiveCallback), state);
    } catch (ObjectDisposedException) {
        // Do nothing - Expected error when the UDP Listener is closed.
    }
}

接收数据包时的端口号只是无意义的垃圾数据,还是有某种用途?

共有2个答案

聂华翰
2023-03-14

连接的每一端都有一个端口号:您的进程正在侦听的已发布的端口号,以及起始(客户端)端口号(可能在不同的机器上)。

有玄天
2023-03-14

每个UDP包都有一个源和目的ip地址和端口,你看到的是源端口地址。

一个众所周知的端口用于将数据发送到,发送数据的机器为数据包的源端口分配一个空闲端口,以便它可以从该端口上的服务器接收数据。

 类似资料:
  • 我已经用重新启动了influxdb,但是没有任何帮助。 我错过了什么? 更新7.11.2016 21:59 更新13.4.2020问题已修复。 这是一个老问题,我不记得我到底是如何解决这个问题的,但我做到了。如果我没记错的话,问题是流入没有加载正确的配置文件,这是我自己当时的愚蠢。可悲的是,我不记得为什么会发生这种事,但我记得这是我自己做的。记住总是正确地阅读文档,并谷歌出它的sht。

  • 当我尝试通过局域网ping minecraft服务器时,文档会说: 我试图通过以下方式在python中实现这一点 这给了我一个 请帮助:(我不知道我的代码出了什么问题。 顺便说一句,发送数据包到那个端口是有效的,而假冒的服务器会出现在minecraft应用程序上。

  • 上一步中我们已经定义好了Server接口,并进行了多次重构,但是实际上那个Server是没啥毛用的东西。现在要为其添加真正有用的功能。大师说了,饭要一口一口吃,衣服要一件一件脱,那么首先来定个小目标——启动ServerSocket监听请求,不要什么多线程不要什么NIO,先完成最简单的功能。下面还是一步一步来写代码并进行重构优化代码结构。 关于Socket和ServerSocket怎么用,网上很多文

  • 问题内容: 为了进行测试,我在不同端口上本地运行网格和节点。 因此,网格在4444上运行,而节点在5556上运行。 在我的测试中,如果我以 然后测试失败,但出现异常 如果我在节点端口5555而不是集线器端口4444上运行测试,则测试通过,如下所示 我认为,我们应该在集线器端口上运行测试,在本例中为4444,而不是5555。 如果我错了,请纠正我。 问题答案: 如果你打算使用 在 通过配置 和 配置

  • 问题内容: 为了进行测试,我在不同端口上本地运行网格和节点。 因此,网格在4444上运行,而节点在5556上运行。 在我的测试中,如果我以 然后测试失败,但出现异常 如果我在节点端口5555而不是集线器端口4444上运行测试,则测试通过,如下所示 我认为,我们应该在集线器端口上运行测试,在本例中为4444,而不是5555。 如果我错了,请纠正我。 问题答案: 如果你打算使用 在 通过配置 和 配置

  • 问题内容: 我需要使用同一端口收听2个不同的多播组。会从和那里听。两个多播组都使用相同的文件,但我无法控制它。 运行程序时,我在每个程序中都接收到两个多播流,即和上广播的数据包。我怀疑问题是由于通用端口引起的。这是我用来订阅多播的代码: 如何在每个程序中过滤特定的多播组? 问题答案: 如果你改变 至 您可能会获得更大的成功。 (如果您更改程序以使用,则可以使其适应未来。)