我用VC编了一个聊天的程序,在互联网上测试的时候,发现如果两主机中有一方IP为内网的IP地址,例如:192.168.*.*,那么这两主机就不能正常连接。如果都是公网的IP,却能正常通信。我知道内网的主机连接互联网可能是通过NAT转换过。但如果要使我的聊天程序,也能使拥有内网IP的主机在互联网上正常通信,该怎么办?像QQ,MSN之类的聊天工具那样,任何类型的IP都可以。
调试欢乐多
NAT需要私网ip首先向公网ip发起连接才能建立,向私网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就可以收到了