我正在Windows 上使用winsocks 编写一个程序,可以将消息发送到另一台计算机。客户端与另一台计算机中的服务器连接并开始交换数据。
它在使用本地地址(192.168.1.*)的本地网络上工作正常,但我无法与公共地址(216.185.45.129)通信;甚至不是我自己的。我可以成功连接到端口 80 上的网站,但无法使用其公共 IP 地址连接到家里的笔记本电脑,无论我使用什么端口(未保留的端口)。
所以我在网上做了研究似乎唯一有效的解决方案是端口转发。
-但是就没有其他方法可以实现这一目标吗?
- Teamviewer 等其他程序如何连接到网络上的其他计算机?
- 是否有我可以使用的已打开但通常未使用的端口?
-至少,我可以转发端口吗my路由器但是not客户有做任何事吗?或者也许让我的程序自动转发端口。
主要问题是,每个路由器都在使用NAT http://en.wikipedia.org/wiki/Network_address_translation区分本地网络和 WAN 中的不同计算机。他需要这样做,因为你在互联网上只有一个IP,但你家里有几台设备。为了归档这个,他使用了端口组。这意味着,如果您使用两台设备从端口 2048 发送到互联网上的网络服务器,路由器会为一台设备提供另一个端口(例如 2049)。响应包含请求者的端口,因此路由器可以将其映射回来。不幸的是,大多数路由器总是映射端口,因此您永远不知道互联网端有哪个端口。
有两种常见的方法可以解决并实现您的目标。
- 转发端口 http://en.wikipedia.org/wiki/Port_forwarding
您可以强制大多数路由器不映射特殊端口,而是将它们绑定到唯一的 MAC 地址。您可以使用 UPNP 配置大多数路由器来执行此操作,但出于安全原因,我不建议这样做,而且它在路由器不允许 UPNP 操作的许多环境中不起作用。
大多数路由器出于游戏原因都具有端口转发功能(主要用于 P2P 网络)
它适用于 TCP 和 UDP。
- NAT穿越 http://en.wikipedia.org/wiki/NAT_traversal
常见的方式是NAT穿越,也称为NAT打洞。我将用UDP 的缩写来描述它。你可以找一下wiki的解释here http://en.wikipedia.org/wiki/TCP_hole_punching对于 TCP 和UDP http://en.wikipedia.org/wiki/UDP_hole_punching这里。不幸的是,您需要一个两个客户端都可以访问的互联网服务器。这里是步骤:
- 两个客户端都联系服务器。服务器现在知道两个客户端的 IP 和端口。
- 服务器将信息发送回客户端。
- 两个(!)客户端现在通过已知地址互相发送包裹。
两个客户端都必须发送 UDP 数据包,并且必须接受第一个数据包丢失的情况。原因就是路由器。如果客户端之前已将包发送到该源,则大多数路由器仅接受来自映射端口上的源的包。
UPDATE关于 Remy Lebau 的评论,我改变了防火墙穿透 http://tldp.org/HOWTO/Firewall-Piercing/index.html部分属于 NAT 穿越,因为它有部分错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)