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

如果服务器从不同的端口响应,客户端不会从服务器接收UDP数据报

曹疏珂
2023-03-14

客户端-NAT后面的Windows桌面,运行UDP客户端应用程序。

服务器-具有公共IP的Ubuntu服务器,运行一个UDP服务器应用程序,该应用程序期望在端口6000上发送数据包。

ClientPrivate/Public-客户端的私有/公共IP

服务器私有/公共 - 服务器的私有/公共 IP

  1. 客户端打开一个UDP套接字Client私人: 777和发送数据报Server公共: 6000
  2. 服务器从Client公共:777接收数据报,并从Server私人:6000向Client公共:777发送响应
  3. 客户端收到响应,一切正常

服务器上的 WireShark 输出: 475 88.xxx.xxx.90 -

客户端上的 WireShark 输出:152 192.168.2.85 104.40.xxx.250 UDP 777 → 6000 153 104.40.xxx.250 192.168.2.85 UDP 6000 → 777

  1. 客户端在 ClientPrivate:777 上打开 UDP 套接字,并将数据报发送到 ServerPublic:6000
  2. 服务器从客户端接收数据报公共:777
  3. 服务器在 ServerPrivate:46666 上打开一个新套接字,并将数据报发送到 ClientPublic:777
  4. 客户端未收到数据报

服务器上的 WireShark 输出: 475 88.xxx.xxx.90 -

客户端上的 WireShark 输出:152 192.168.2.85 104.40.xxx.250 UDP 777 → 6000

为什么客户端在案例 1 中收到数据报,而在案例 2 中没有?


共有1个答案

林元明
2023-03-14

我认为这是由于客户端NAT造成的。当您的客户端向服务器发送公共IP时,NAT路由器会在其内部连接表中创建一个条目(类似于“192.168.2.85[777] =

所以当从104.40.xxx返回响应时。250[6000],NAT将找到匹配条目并将响应返回给客户端机器。该条目是它如何知道将数据包发送到客户端网络中的哪台计算机的。但是,当104.40.xx返回响应时。250[46666],这与表中的任何条目都不匹配,因此它正在丢弃该数据包。

这就是NAT的工作方式。考虑一下,如果你的NAT后面有另一台机器也在与同一台服务器通信,比如,“192.168.2.86[777]=

端口转发允许您打开内部计算机以供外部世界进行常规访问。但是缺少这一点,您真的不希望任何随机IP地址/端口对能够将数据报发送到客户端计算机。

 类似资料:
  • 我想做的是: 为了学习游戏编程,我使用专用服务器和UDP创建了一个回声设置。专用服务器在不同的城市(也就是不在我的本地网络中)。 在我的本地计算机上,我有一个udp客户端和服务器(两个不同的程序)。当我第一次启动python服务器时,windows防火墙立即询问我是否要添加异常。在允许我的python服务器联网之后,我仍然没有收到任何消息。(客户- 我的问题是: 游戏如何解决这个问题?我没有为我想

  • 我正在尝试使用UDP在服务器(在公共IP上)和客户端(通过NAT)之间进行双向通信。我的逻辑是,如果服务器向IP和它接收数据包的端口发送一些数据,客户端仍然应该得到它,因为NAT最终会有将数据包发送到客户端的映射。 客户端有 2 个进程,一个用于发送数据包,另一个进程用于接收数据。服务器继续等待数据,如果它获得数据,它会将数据发送回从接收数据的端口和 IP。 客户代码如下: client_recv

  • 嗨,我的问题很简单: 我尝试通过TCP连接建立UDP连接(因为多个客户端通过多个通道连接到服务器,我想通过主TCP连接识别相同的客户端) 我通过在客户机上创建TCP和UDP套接字来实现这一点,并通过TCP将操作系统随机分配的本地UDP端口传输到服务器。(在Windows上,我通过getsocketname()获得sendto()之后的端口)。在服务器上,我使用这个端口将UDP数据包发送到这个客户机

  • 所以我在玩插座。io正在尝试制作一个多人迷你游戏,但是这个插座。我在客户端使用的emit()函数不起作用。它既不会在客户端浏览器上也不会在服务器控制台上抛出错误。它只是不会发出事件。也许是插座。位于()服务器端,但该服务器端未接收到它。 有一个html文件夹,包含jquery.js,socket.io-1.2.0.js,index.html,main.js和style.css 这是基本的代码,但在

  • 我有一个客户端测试功能,它将测试对象发送到socket.io服务器,该服务器的工作是等待客户端事件,然后将数据发送到原始客户端发出事件的房间中的每个客户端。但是,只有原始客户端从服务器接收事件。房间中的其他客户端没有接收到它。 我已经尝试了以及服务器端。两个客户端肯定加入同一个房间。服务器也从原始客户端接收事件。 Server.js: 父组件: 子组件: 我希望在两个连接的客户端上读取服务器消息,

  • 我正在Unity中制作一个游戏,我试图将数据从客户端发送到服务器并返回到客户端(试图保存实例),但当我收到数据并尝试将数据发送回客户端时,它表示udp客户端未连接。 它成功地将数据从我的Unity客户端发送到服务器,但一旦它到达那里,套接字就会断开连接,我就无法返回任何内容。正如你所看到的,我试图设置一些多播选项,但它似乎不能正常工作。 客户: 服务器: 因此,服务器中UdpClient的实例会保