我用VC编了一个聊天的程序,在互联网上测试的时候,发现如果两主机中有一方IP为内网的IP地址,例如:192.168.*.*,那么这两主机就不能正常连接。如果都是公网的IP,却能正常通信。我知道内网的主机连接互联网可能是通过NAT转换过。但如果要使我的聊天程序,也能使拥有内网IP的主机在互联网上正常通信,该怎么办?像QQ,MSN之类的聊天工具那样,任何类型的IP都可以。

解决方案 »

  1.   

    公网连接公网和私网连接公网是可以的,但是私网连接私网和公网连接私网是不行的。
    NAT需要私网ip首先向公网ip发起连接才能建立,向私网ip连接是不行的。想你这样的网络工具都是需要一个公网服务器做连接中转的
      

  2.   

    QQ、MSN有外网的服务器作中间人告诉对方的端口和IP都是什么,然后进行发送要么也可以使用端口映射
      

  3.   

    NAT说全了很麻烦 有很多材料可以参考简单说一下:首先我们设两个客户端是Alice和Bob, Alice的NAT网关是AliceNAT, 而Bob的是BobNAT, 聊天工具服务器是Server1. 如果Alice和Bob都有公网IP, 情况忽略 顺利通信2. 如果Alice在内网, Bob有公网IP:
    Alice --- [源端口4000, 目标端口4001] -->AliceNAT------->Bob
    这个时候AliceNAT随机开放一个端口, 比如说63321 连接Bob 4001, 并记录63321与Alice 4000对应(一个会话)
    当Bob 4001发送消息到AliceNAT 63321的时候 AliceNAT把消息转发到Alice 4000 实现连接
    3. 如果Alice和Bob都在内网:
    在讨论之前我们先简单说一下NAT的类型, 假设Alice从4000发送数据给Bob以后, 又向Server发送数据
    如果AliceNAT为向Server的数据再次分配一个端口, 一个会话, 那么基本上你就没盼头了..问题无解
    如果AliceNAT仍然使用63321向Alice 4000在转发了来自server的数据, 那么问题就简单得:首先Alice向一个有公网IP的Server发送数据, 在AliceNAT上建立一个会话, 然后Bob也向Server发送数据建立BobNAT上的会话
    Server 通知Alice BobNAT的端口, 向Bob通知AliceNAT的端口(比如63321), 那么Bob只要向AliceNAT 63321发送数据, Alice就可以收到了