我正在Windows上使用winsocks编写程序,可以将消息发送到另一台计算机。客户端与另一台计算机中的服务器连接,并开始交换数据。
它使用本地地址(192.168.1。*)在我的本地网络上正常工作,但我无法与公共地址通信(216.185.45.129);甚至不是我自己的。我可以使用其公共IP地址成功连接到端口80上的网站,但不能连接到家中的笔记本电脑,无论我使用哪个端口(未保留端口)。
所以我在网上进行了研究,唯一可行的解决方案就是端口转发。
- 但绝对没有办法实现这个目标吗?
- Teamviewer等其他程序如何连接到网络上的其他计算机呢?
- 我可以使用已打开但通常未使用的端口吗?
- 至少,我可以转发我的路由器上的端口但不让客户端做任何事情吗?或者让我的程序自动转发端口。
答案 0 :(得分:3)
主要问题是,每个路由器都使用NAT来区分您的lokal网络中的不同计算机与WAN。他需要这样做,因为你在互联网上只有一个IP,但你家中有几个设备。为了存档,他使用了一组端口。这意味着,如果您使用两台设备将端口2048发送到互联网上的网络服务器,则路由器会为一台设备提供另一个端口(如2049)。响应具有请求者的端口,因此路由器可以将其映射回来。不幸的是,大多数路由器总是映射端口,所以你现在从来没有从互联网端拥有哪个端口。
有两种常用的方法可以解决并归档您的目标。
您可以强制大多数路由器不映射特殊端口,但将它们绑定到唯一的MAC地址。您可以使用UPNP配置大多数路由器来执行此操作,但出于安全原因,我不建议这样做,并且它在路由器不允许UPNP操作的许多环境中也不起作用。 大多数路由器出于游戏原因具有端口转发功能(主要用于P2P网络) 它适用于TCP和UDP。
常见的方法是NAT遍历,也称为NAT穿孔。我将简要描述UDP。您可以在此处找到TCP和here的Wiki解释UDP。不幸的是,你需要一个客户端可以访问的互联网服务器。这里的步骤:
两个客户端都必须发送UDP包并且必须接受第一个包丢失。原因是路由器。如果客户端之前已经将包发送到该源,则大多数路由器仅接受来自映射PORT上的源的包。
<强>更新强> 关于Remy Lebau的评论,我将Firewall piercing部分更改为NAT Traversal,因为它部分错误。