基于tcp的p2p有些路由不支持动态的nat穿透,这时候的解决办法就是upnp
这也是主流的p2p下载软件常用的方法(像迅雷,风行,快播等)
upnp的介绍网上的资料很少,找了很久只找到codeproject上的一个c#的cs,但还不能用(可能是国内的路由和外国的有些差别).
在国内的找了很久都是一篇文章写得一点用处都没有.
没办法只好自己看原有的参考文档,呵呵不过还是被我搞定了.
upnp是一个路由的通用功能,一般都有的,没有的只是极特别的神级的人物!
下面贴出我的解决办法
我的解决方法:
upnp只有3个操作,1)添加端口,2)删除端口 3)一个是DisConver查询,以及一个描述的xml文档
1.首先是广播一个包到239.255.255.250:1900
然后启动一个Soket 接收Udp返回(如果路由没有启动upnp是收不到消息的,注意设一个超时时间)
接收到的消息里一些描述信息,路由型号,描述的地址,以及一些参数。
2.添加端口 (我下了codeproject上的代码,他是使用ipc的service,我试了好几个路由都不成功,可能是我的路由太老了吧)
我建立一个socket tcp连接到路由的1900端口,把信息xml文档直接发上去就可以了,路由会返回是否成功的标识
一般成功了会到 200 OK 字符。
注意:xml文档不能含有中国字符。
3.删除端口 这个操作非常简单,同2步,把删除的xml发过去就行了,
删除的时候只需要填写要删除的外网映射端口就可以确定了
3)如果想修改一个端口的时候,只要再添加一次就可以了
给出我的切图
软件图片
路由