穿透NAT怎么写?VC++,只需要给服务器发信息(这个好实现),服务器需要向(内网IP)发信息

解决方案 »

  1.   

    http://blog.chinaunix.net/u3/94743/showart_2081122.html
      

  2.   

    我给你讲下穿越NAT的思路:
    首先你要保证把你的服务器挂在外网上,如何挂这个我就不多说了(设置下路由器)。然后客户端都在内网中。启动server之后,clientA连接到server.这里我要讲下clientA连接到server的过程:当clientA发送connect请求之后。请求的IP数据包到达路由器,路由器会进行端口映射。什么意思呢?比如:你的IP数据包中的IP地址和端口分别是:192.168.1.100和2000.那么当你的这个IP数据包到达路由器的时候,路由器会用自己的IP地址和自己随机选取的一个端口对原来IP数据包的IP和port进行替换.比如:替换的结果是:132.126.122.12(你的路由器IP)和1200(路由器自己选择的端口).然后路由器会自己的内存中做一个映射:192.168.1.100:200---->1200。这就是NAT所谓的端口地址映射协议。然后路由器会把这个IP数据包发到服务器。所以服务器所得到的IP地址就是132.126.122.12:1200。
    然后又有一个clientB连接到了服务器.然后服务器记下他的IP地址和端口。比如是:120.120.120.100:3000
    到目前为止:我们服务器有下面的信息:
    clientA:132.126.122.12:1200
    clientB:120.120.120.100:3000核心的思路要开始了:
    clientA向服务器发送一个请求,这个请求是:要求服务器发送clientB的IP地址和端口给自己(与此同时服务器也悄悄的向clientB发送clientA的IP地址和端口,并且要求clientB向clientA发起连接请求)。这步完成之后clientA和ClientB都知道了对方的IP地址和端口。哦!还有一点就是clientA和ClientB在开始的时候要开启一个线程。用于监听外部的连接请求。好了!这个时候clientA会向clientB发起连接请求。clientB会向clientA发送连接请求。由于网络情况很复杂。你不知道谁先连接上谁。但是两个client都有一个线程监听到来的连接。所以这个不用担心。现在我们假设情况是clientA的连接速度快于clientB。clientA的连接请求会先到达clientB的路由器。但是ClientB的路由器发现这是一个来自WAN的数据包。并且是第一次来。clientB的 NAT会认为这是一条不请自来的连接请求。所以丢弃之。但是却在clientB的NAT上留下了一个痕迹.我们俗话称之为:NAT打洞。然后clientB的连接请求达到了ClientA的路由器。ClientA的NAT并不会把这个连接请求丢弃。因为clientA的路由器知道ClientA以前连接过clientB,而这又是一个来自clientB的连接请求。然后clientA的线程就能接受到clientB的连接. 你不需要关心clientA和clientB都是在不同的LAN内如何进行通信的。这个过程是路由器的端口地址映射机制完成的。就是我最开始提到的那个。网上很多P2P源代码、。你去买一本书嘛。上面有很好很完整的源代码<<windows网络与通信程序设计>>王艳平写的。
    如果你觉得我说的有用。请把所有分都给我 哇哈哈~~~