在广域网上进行TCP和UDP套接字服务器

3

我尝试创建一个同时使用TCP和UDP的服务器和客户端。该服务器在局域网环境下运行良好,但是当通过广域网传输时,UDP消息无法接收。我认为这是因为用于发送数据的UDP套接字没有在NAT表中保留足够长的时间以返回任何信息。是否有一种方法可以使UDP端口在路由器中保持开启(无需端口转发),或者使用与已连接的TCP连接相同的UDP端口?谢谢。

1个回答

3
如果您没有获得任何流量,可能是因为被防火墙阻止了。在这种情况下,不是关于转发,而是关于打开端口。
大多数(如果不是全部)NAT /防火墙设备一旦穿过NAT打洞,将允许双向UDP流量。也就是说,如果我在这里的笔记本电脑,它在NAT/防火墙后面,发送一个UDP数据包到互联网,我的NAT/防火墙将允许返回UDP流量到原始端口号。我经常使用UDP,我的经验是这是规则,很少有例外。
但请记住,UDP数据包不能保证传递。
您的客户端是否在NAT后面?客户端发送的任何数据包是否到达服务器?问题是否出现在服务器到客户端的方向上?
如果您对UDP和TCP使用相同的端口号,这不会改变情况。您无法在TCP连接上搭载,因为它是不同的协议。 网络地址转换(NAT)单播UDP行为要求

http://en.wikipedia.org/wiki/UDP_hole_punching


我尝试了你建议的方法,但仍然没有成功。我已经让服务器获取了用户连接时发送的WAN IP和端口,然后客户端在所有端口上监听来自服务器的通信。你能否看一下代码,看看有没有明显的错误?非常感谢。 - Stephen
@Stephen。好的。请在你的问题中添加一个链接。我会使用服务器端的recvfrom()和sendto()方法来完成它。你需要将该套接字绑定到特定的端口号上。在客户端,确保只使用一个套接字。 - Guy Sirton
这里有一个链接,其中包含我所有的通信和连接代码。基本上,我的服务器的想法是用户通过TCP连接进行登录,然后所有后续通信都通过UDP完成。感谢您的查阅。http://stackoverflow.com/questions/7018796/tcp-udp-socket-server-on-wan - Stephen
1
@Stephen - 我没有看到客户端在你的代码中发送任何UDP消息。你可能想要创建一个客户端UDP套接字。向它发送一些内容。然后在同一个套接字对象上接收(可能在另一个线程上)。此外,你正在执行trans.ReceiveFrom(content,ref Remote);但我没有看到你在哪里执行SendTo回到服务器需要做的远程端点。 - Guy Sirton
1
@Stephen,由于NAT的存在,您需要使用远程端点。在服务器端,您实际上不知道对等端口号是什么,因为NAT会进行转换。 - Guy Sirton
显示剩余3条评论

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