日期:2014-05-18  浏览次数:20944 次

同一个私有IP域下的两个局域网通信 求解啊求解
我们学校寝室和教学楼的ip是两个局域网,
 我想写一个小软件,可以实现教学楼里的电脑与寝室里的电脑通信聊天

 就按照网上的普通的有关C#网络编程文章学习,之后自己仿照着写了一个udp的聊天小软件,在寝室的电脑中试运行成功。
 后来又安装到教学楼的电脑上,却不能与寝室的电脑实现通信。

 于是上网查,说网络互连需要udp打洞,可那是向公网的连接, 我这样的也需要打洞么 !?

 我已经知道寝室电脑ip和教学楼所有电脑的ip地址(教学楼ip是静态分配的),用的udpClinet类,可就是连接不上
 到底是因为什么 导致连接不上呢, 不思不得其解啊,

 还望各位大哥大姐们给予指点。..

------解决方案--------------------
呵呵,我现在使用的笔记本的ip是192.168.0.101,你试试连得上么?

这是明摆着的。网络编程,就是要懂NAT原理。
------解决方案--------------------
你就打吧。

即使像腾讯这样的公司的产品,我相信成功率也不到70%。所以一个软件应该有多种联系方式。例如首先判断是否可以直接联系,如果不能直接联系那么也许打洞,也许根本不打洞(我相信你从网上找来关于打洞的demo程序80%以上都是假的)。实际上网络软件可以在其主服务器的帮助下,在距离两个终端都很近的公网上找到一个用户,然后这个用户的客户端就作为那两个客户端的代理服务器。当然也可以通过服务提供端的服务器(例如分布在全中国的几千台服务器之一)来作为通讯代理。而根本不需要不很靠谱的udp打洞。
------解决方案--------------------
对于腾讯来说,它可能的次序例如:在udp直连失败之后,会尝试tcp直连,然后是尝试通过离两端最近的公网用户进行tcp代理,然后尝试通过里两端最近的公司自己的服务器进行tcp代理,如果还不行就试图通过此服务器的http 端口做通讯代理,如还不行就试图通过此服务器的443、445等端口做服务代理,如果还连不上就会告诉用户“连接失败”了。

需要支持多种连接方式,保证尽量联通。
------解决方案--------------------
如果能ping通远端的电脑,那看你的p2p软件开的是哪个端口,
在本地电脑上运行cmd打开命令行窗口,执行下面的命令
telnet 对方的IP 你那个软件的端口号
比如
telnet 192.168.1.100 80

如果不能连接,则说明远端电脑的端口没有开放,或者Nat没有映射这个端口