C ++套接字:通过互联网在PC之间进行通信

时间:2015-02-22 12:02:16

标签: c++ network-programming winsock

我正在Windows上使用winsocks编写程序,可以将消息发送到另一台计算机。客户端与另一台计算机中的服务器连接,并开始交换数据。

它使用本地地址(192.168.1。*)在我的本地网络上正常工作,但我无法与公共地址通信(216.185.45.129);甚至不是我自己的。我可以使用其公共IP地址成功连接到端口80上的网站,但不能连接到家中的笔记本电脑,无论我使用哪个端口(未保留端口)。

所以我在网上进行了研究,唯一可行的解​​决方案就是端口转发。

- 但绝对没有办法实现这个目标吗?

- Teamviewer等其他程序如何连接到网络上的其他计算机呢?

- 我可以使用已打开但通常未使用的端口吗?

- 至少,我可以转发我的路由器上的端口但让客户端做任何事情吗?或者让我的程序自动转发端口。

1 个答案:

答案 0 :(得分:3)

主要问题是,每个路由器都使用NAT来区分您的lokal网络中的不同计算机与WAN。他需要这样做,因为你在互联网上只有一个IP,但你家中有几个设备。为了存档,他使用了一组端口。这意味着,如果您使用两台设备将端口2048发送到互联网上的网络服务器,则路由器会为一台设备提供另一个端口(如2049)。响应具有请求者的端口,因此路由器可以将其映射回来。不幸的是,大多数路由器总是映射端口,所以你现在从来没有从互联网端拥有哪个端口。

有两种常用的方法可以解决并归档您的目标。

  1. Port Fowarding
  2. 您可以强制大多数路由器不映射特殊端口,但将它们绑定到唯一的MAC地址。您可以使用UPNP配置大多数路由器来执行此操作,但出于安全原因,我不建议这样做,并且它在路由器不允许UPNP操作的许多环境中也不起作用。 大多数路由器出于游戏原因具有端口转发功能(主要用于P2P网络) 它适用于TCP和UDP。

    1. NAT Traversal
    2. 常见的方法是NAT遍历,也称为NAT穿孔。我将简要描述UDP。您可以在此处找到TCP和here的Wiki解释UDP。不幸的是,你需要一个客户端可以访问的互联网服务器。这里的步骤:

      1. 两个客户都联系服务器。服务器现在知道两个客户端的IP和PORT。
      2. 服务器将信息发送回客户端。
      3. 两个(!)客户端现在都在已知地址上相互发送包。
      4. 两个客户端都必须发送UDP包并且必须接受第一个包丢失。原因是路由器。如果客户端之前已经将包发送到该源,则大多数路由器仅接受来自映射PORT上的源的包。

        <强>更新 关于Remy Lebau的评论,我将Firewall piercing部分更改为NAT Traversal,因为它部分错误。