【问题标题】:TCP and UDP Socket Server on a WANWAN 上的 TCP 和 UDP 套接字服务器
【发布时间】:2011-08-12 05:36:49
【问题描述】:

我正在尝试创建一个同时使用 TCP 和 UDP 的服务器和客户端。服务器在 LAN 设置中运行良好,但在通过 WAN 传输时未接收到 UDP 消息。我相信这是因为用于发送数据的 UDP 套接字没有在 NAT 表中保留足够长的时间来返回任何信息。有没有办法让 UDP 端口在路由器中保持打开(没有端口转发)或使用与已连接的 TCP 连接相同的 UDP 端口?提前致谢。

【问题讨论】:

    标签: c# networking tcp udp wan


    【解决方案1】:

    如果您没有收到任何流量,则可能只是被防火墙阻止了。在这种情况下,它不是关于转发,而是关于打开端口。

    大多数(如果不是全部)NAT/防火墙设备将允许双向 UDP 流量,一旦通过 NAT 打孔。也就是说,如果我的笔记本电脑位于 NAT/防火墙后面,将 UDP 数据包发送到 Internet,我的 NAT/防火墙将允许将 UDP 流量返回到原始端口号。我经常使用 UDP,我的经验是这是规则,很少有例外。

    请记住,虽然 UDP 数据包不能保证被传送。

    您的客户端是否在 NAT 后面?客户端发送的任何数据包都会到达服务器吗?是服务器到客户端方向的问题吗?

    如果您对 UDP 和 TCP 使用相同的端口号,这不会改变这种情况。您不能搭载 TCP 连接,因为它是不同的协议。

    Network Address Translation (NAT) Behavioral Requirements for Unicast UDP

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

    【讨论】:

    • 是的,问题出在服务器到客户端的方向。我相信问题可能在于你所说的。我目前没有使用最初发送 UDP 传输的端口,因此我无法通过 NAT 返回。我将尝试调整客户端和服务器以适应这一点。感谢您的回答。
    • 我尝试了您的建议,但仍然不成功。我让服务器检索 WAN IP 和用户在连接时发送的端口,然后客户端正在侦听所有端口以与服务器进行通信。您是否可以查看一些代码,看看是否有任何明显的错误?我很感激。
    • @斯蒂芬。当然。为您的问题添加链接。我这样做的方式是在服务器端使用 recvfrom() 和 sendto() 。您将该套接字绑定到特定的端口号。在客户端确保使用单个套接字。
    • @Stephen - 我看不到客户端在您的代码中发送任何 UDP 消息的位置。您可能想要创建一个客户端 UDP 套接字。送东西给它。然后在同一个套接字对象上接收(可能在另一个线程上)。你也在做 trans.ReceiveFrom(content,ref Remote);但我看不到您在哪里将 SendTo 发送回远程端点,这是服务器需要做的。
    • @Stephen 由于 NAT,您需要使用远程端点。您实际上并不知道服务器端的对等端口号是什么。 NAT 翻译它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2011-07-25
    相关资源
    最近更新 更多