前几天还有人在群里问p2p的东西,这个原理满网都是,但是示例就比较少,大多是开源的成品,代码阅读起来很纠结。今天翻硬盘看到一份很精简但是很清晰的代码,发出来共享。
保留作者信息:
//作者:shootingstars(zhouhuis22@sina.com)
/* 源码修改声明:
*
* 这个修改的代码是早期为了节省时间在原作者(shootingstars)的代码的基础上修
* 改测试用的。原代码的版权归原作者所有。对于做的修改的部分本人不作任何担保,
* 只是为了方便大家使用修改后的代码对于UDP穿透进行验证而已。
*
* 原作者的关于UDP穿透的简介是网上较早的一份对于UDP穿透内网的说明,但是并
* 不是特别的清楚和详细。本人在从事P2P程序开发的过程中, 对于内网穿透做了很
* 好的实现。由于经常有人问起这方面的问题,因此决定将自己对于使用UDP内网
* 穿透的经验也写出来与大家分享, 希望对于从事这方面工作的朋友有所帮助.
*
* 源码修改者简介:
* Hwycheng Leo, like C/C++/Python/Perl, hate Java.
* 一直使用C/C++语言从事网络服务器和客户端方面的开发工作。近两年来主攻P2P技术方向。
* 开发了完全免费强大的BitTorrent下载软件 - FlashBT(变态快车). 近期在公司负责开发
* P2P + IM 的商业化平台。
* 邮件/MSN: FlashBT@Hotmail.com [欢迎热爱网络编程和P2P开发的来信交流]
*/
下面是一个模拟P2P聊天的过程的源代码,过程很简单,P2PServer运行在一个拥有公网IP的计算机上,P2PClient运行在两个不同的NAT后(注意,如果两个客户端运行在一个NAT后,本程序很可能不能运行正常,这取决于你的NAT是否支持loopback translation,详见http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt,当然,此问题可以通过双方先尝试连接对方的内网IP来解决,但是这个代码只是为了验证原理,并没有处理这些问题),后登录的计算机可以获得先登录计算机的用户名,后登录的计算机通过send username message的格式来发送消息。如果发送成功,说明你已取得了直接与对方连接的成功。
程序现在支持三个命令:send , getu , exit
send格式:send username message
功能:发送信息给username
getu格式:getu
功能:获得当前服务器用户列表
exit格式:exit
功能:注销与服务器的连接(服务器不会自动监测客户是否吊线)
完整工程代码+文档打包下载:201305071124554175