我正在用 UDP 套接字编程C
。为了监听端口,我需要在路由器中转发端口。我的问题是如何避免这样做并且仍然能够通过互联网进行通信,如果无法使用套接字进行通信,那么最低级别可能是多少?换句话说,每个设备都可以监听http服务器,那么http是唯一的解锁方式吗?
答案1
通常,您的 ISP 会为您提供一个 IP 地址,而您的家庭路由器也会提供网络地址解读(NAT) 向您的 ISP 假装您家庭网络中的所有设备都是与路由器本身地址相同的单个设备。
因此,如果有人想从外部联系您的家庭网络,路由器必须“转发端口”到您的家庭网络中运行该服务的设备,因为从外部可见的唯一 IP 地址是路由器的 IP 地址。
如果您不想这样做,唯一的选择是直接在路由器上运行服务,或者断开路由器与 ISP 的连接,然后连接直接运行服务的计算机(如果它有这样做的硬件)。
无论您使用什么协议,都没有其他方法。
您还可以向 ISP 付费,让其提供多个 IPv4 地址(这会很昂贵)。或者,如果您的 ISP 为您提供 IPv6 全局前缀,那么您家庭网络中的每个设备都将拥有自己的 IPv6 地址,可以从外部访问该地址。因此不需要 NAT,不需要端口转发,但它只适用于 IPv6。
OTOH,设置端口转发并不完全是黑魔法,所以就这样做吧。
编辑
当您“访问某个网站”时,即您本地的 http客户将联系远程http服务器,路由器中的 NAT 会将传出数据包的源地址从您的私有设备地址重写为 ISP 的 IP 地址。它还会记住本地设备打开了传出连接,并且当属于该连接的传入数据包到达时,它将相反地重写目标地址并将它们发送到本地设备。这就是 NAT。
因此对于外向的来自本地设备的连接,您不需要端口转发。 NAT 会为您处理这个问题。为了传入连接,例如,如果您运行 http服务器,您需要告诉您的路由器“请将端口80转发到以下本地设备”。
如何在不访问路由器设置的情况下打开端口?
为了传入连接,你不能。正如我已经尝试解释的那样。
编辑
如果你用谷歌搜索 UDP 的示例程序,总会有一个服务器侦听端口和客户不是监听,而是联系服务器(之后服务器和客户端都可以在任何方向交换数据包)。那么“如何在不监听端口的情况下接收信息”就是你编写客户端,而不是服务器,然后服务器可以向客户端发送数据,因此客户端“接收信息”。
如果没有端口转发,您就无法在 NAT 后面运行服务器。就是这样。无论您问多少次都行。对于 TCP 不行,对于 UDP 也不行,通过“使用低级协议”也不行。
如果您不想在路由器的 GUI 中启用端口转发:许多路由器允许您通过 UPnP 设置端口转发,有时甚至是临时端口转发。您的路由器可能有也可能没有此功能。
还有其他技巧,例如首先联系一般类型的服务器,然后该服务器将与 NAT 后面的其他对等点建立连接(请参见例如眩晕协议)。
但如果您位于 NAT 之后,您首先必须联系服务器在“真实”的互联网上。该服务器将侦听端口,而您的客户端不会。或者,如果您有服务器侦听端口,则需要设置端口转发。没有其他选择。忍受它。