看网上说的很玄呼,我不是很理解.谁能比较通俗的介绍一下. 
比如 在公网有一个server S, 有两个client, A和B位于两个不同的内网, 假如单纯的A 与 S 通信,那么 A的connect 函数写的是 S的公网IP与端口吧? 而S收到的数据后, 得到与其连接的Socket的IP与端口 是 A的路由器的地址与端口吗?  如果是的话,那并
没有涉及到NAT转换呀? 这是路由器该干的事吧?! 
假如 A要与B进行通信, 我的想法是这样: S返回B的路由的端口与IP 给A, A connect 这个地址与端口,与B进行通信. 而路由器自动将数据映射到各自相关的内网机器.   请大家说说我错在哪里了?   

解决方案 »

  1.   

    "比如 在公网有一个server S, 有两个client, A和B位于两个不同的内网, 假如单纯的A 与 S 通信,那么 A的connect 函数写的是 S的公网IP与端口吧?"
    对,没错!"而S收到的数据后, 得到与其连接的Socket的IP与端口 是 A的路由器的地址与端口吗?"
    主要看路由器是怎样实现NAT的,多数情况下,S获得的IP和端口是路由器的IP和路由器内的NAT表的一个索引“假如 A要与B进行通信, 我的想法是这样: S返回B的路由的端口与IP 给A, A connect 这个地址与端口,与B进行通信. 而路由器自动将数据映射到各自相关的内网机器.  请大家说说我错在哪里了?  ”不清楚你是用TCP还是UDP实现,还是混合使用,对于不同协议,需要处理不同情况,例如对于TCP,需要设置端口重用。。
    另外一个,B没有请求A的情况下,A自主来连接B,一般来说,B的防火墙认为A的数据是不请自来,会拒绝的。关于NAT穿透,我现在也在研究中,有机会一起讨论,^_^
      

  2.   

    另外一个,B没有请求A的情况下,A自主来连接B,一般来说,B的防火墙认为A的数据是不请自来,会拒绝的。假如B没有防火墙,开放了所有端口呢?  TCP与UDP分别要怎么实现A与B通信呢? 
      

  3.   

    一般路由器都有防火墙。
    如果没有防火墙,B要接受A的连接,B必要绑定一个端口,这个端口就是B和S连接时,使用的端口
      

  4.   

    按我个人的理解,你所说的就是所谓的打洞问题.
    既:内网中的两个客户端A,B,连接到外网的服务器S,在S处都有相对应的A和B的ip地址和端口号.
    假如 A要与B进行通信,
    首先,A通知服务器S,让B向A发送udp包,S发报文给B,报文中报含将A对应的ip地址和端口号.
    其次,A可以从服务器S处获取到B对应的Ip地址和端口号.A根据B的IP地址和端口号向B发送udp包.(肯定会失败,因为B的nat会丢弃)
    再次,B根据S发送过来的报文请求,向A的Ip地址和端口号向A发送udp包.
    至此,A与B之间就可以进行upd发送报文了.
    最近也是在研究这个,还望指教.
      

  5.   

    4楼的我还是不理解.
    [首先] :  B 从 S 获得 A的ip与端口
    [其次] :  A 从 S 获得 B的 ip 与端口, A发送udp包会失败(既然会失败为什么要发送呢? 很费解啊?)
    [再次] :  B 向 A 发送 udp包   , 这样 A 是否也会丢弃这个包呢? 这样两者怎么能进行通信呢? 
      

  6.   


    [其次] :  A 从 S 获得 B的 ip 与端口, A发送udp包会失败(既然会失败为什么要发送呢? 很费解啊?)
    这个是为了在A的路由防火墙留个记录,使得下次B的数据到来的时候,A的路由防火墙认为这些数据是A请求的数据,这样A的路由防火墙就不会抛弃这些数据了。
    [再次] :  B 向 A 发送 udp包  , 这样 A 是否也会丢弃这个包呢? 这样两者怎么能进行通信呢?
    不会了,因为A已经向B发送了数据,B的数据到达A的路由时候,路由认为是A请求的数据,不会再拒绝了
      

  7.   

    先看这个
    http://zhaisj.blog.51cto.com/219066/58651
    看完看这个(有源码)
    http://www.ppcn.net/n1306c2.aspx
    最后看这个
    http://www.ppcn.net/n3520c38.aspx