【发布时间】:2016-10-21 08:40:41
【问题描述】:
这可能解释起来有点奇怪,但我会尽力而为。
我有一个 Lua 程序,旨在通过网络提供一些数据。具体来说,互联网。程序实际传输的数据只是存储在 UDP 数据包中的字符串。概括地说,这就是程序的运行方式:
- 第一个客户端启动程序并指定它们是连接的“主机”。程序在 UDP 端口 6000 上打开一个连接,主循环侦听在该端口上接收到的任何数据包。
- 第二个客户端启动程序并指定它们要连接到端口 6000 上的“主机”。用户输入 IP,客户端使用 6050 和 7000 之间的随机端口打开 UDP 连接
- 当客户端成功连接到服务器时,它们会发送一个“连接”数据包,其中仅包含一个“202 OK”字符串。 “主机”收到此信息并注册新客户端
- 现在连接已经初始化,程序可以使用注册的数据在彼此之间发送数据。
现在,在本地网络上,这个程序可以正常工作。 “主机”模式的目的是让多个客户端连接到主机,并让主机将数据包从一个客户端中继到所有当前注册的客户端。端口选择是任意的,来自客户端的随机端口选择只是为了允许从单台计算机进行调试和测试。这已经在物理网络上的两台或多台计算机之间进行了测试,并且成功运行。但是,当我尝试在互联网上运行它时,这是不行的。我知道端口已关闭,这就是它不起作用的原因。但是看到我将(私下)分发这个程序,我不能指望每个人都打开他们路由器上的端口(或知道如何)。安全性目前不是该程序关注的问题,在当前状态下应该被忽略。话虽如此,我承认通过网络使用该程序可能会出现很多问题,我接受这一点。关于主要问题,如何让主机和客户端通过 Internet 进行通信,而无需打开端口?
我会详细说明 - 例如,浏览器。虽然这项技术与我正在做的完全不同,但绘制图片更容易 - 浏览器从 Web 服务器请求数据,然后将其发送回客户端。但是等等,如果路由器处于默认状态(我希望)所有端口都关闭了?那么如果端口关闭,客户端如何接收这些数据呢?
我希望这有点道理,而且我听起来不像是个十足的傻瓜。
【问题讨论】:
-
了解眩晕/转身。您还可以阅读有关 SIP 寄存器如何与 NAT 一起使用的信息。 SIP 使用您描述的机制。客户端发送注册和服务器响应 200 ok。
-
您遇到了一个不小的问题。然而,要求“主机”打开端口的情况并不少见,this one 之类的网站就证明了这一点。对于每种替代解决方法,您仍然可能会发现它不起作用的情况。
-
我确实想过只为主机打开端口,但我还没有尝试过那个 Michael-sqlbot。我想我可能会像@moteus 建议的那样选择使用 stun/turn - 我一直在查看一些常见问题解答和有关它的事情,这看起来像是我所追求的方式。从现在开始,我将面临的最大挑战是在 LUA 中找到/进行实现
标签: sockets networking lua udp port