首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

VB WINSOCK TCP UDP穿透如何实现

2012-12-14 
VB WINSOCK TCP UDP穿透怎么实现我正在做一个多用户通讯软件,可是内网和内网用户,怎么才能直接连接咧?思路

VB WINSOCK TCP UDP穿透怎么实现
我正在做一个多用户通讯软件,可是内网和内网用户,怎么才能直接连接咧?

思路是这样的:

服务器S----有一个外网的IP地址

用户A------假如是北京内网用户(网吧)

用户B------假如是河南内网用户(网吧)

1.首先服务器监听IP和端口

2.用户A连接服务器

3.用户B连接服务器

4.服务器获得用户A和用户B的真实地址和端口

5.服务器告诉A和B双方的真实IP和端口

6.到这里就不知道怎么让用户A和用户B直接连接了,因为此时用户A或B的WINSOCK端口处于和服务器S的连接状态,怎么才能让A和B在不端开连接或端开连接但端口号不变的情况下让A和B能直接进行连接!

TCP不行的话,UDP可以吗? 具体怎么实现? 怎么才能让多个用户同时能发消息给A,并且A能收到!


希望高手解答,如果有办法实现,本人愿意出100-300元买此实现方法!本人很穷,但很敬业!希望大家帮帮忙!在这里谢谢大家了!




[解决办法]
你要做什么啊?
你想实现用户A和用户B的通讯可以通过服务器中专

[解决办法]
如果你有外网固定IP的服务器,tcp,udp都可以实现多用户发数据给A
[解决办法]
可以联系我:QQ:15298196
[解决办法]
上面的朋友加我QQ: 593822895  谢谢
[解决办法]
上上面的朋友加我QQ:767431339 谢谢,我也想学
[解决办法]
服务器中传的话服务器的处理能力直接决定了整套系统的处理能力

其实楼主应该找找UDP/TCP打洞的方案,不过UDP好找,TCP不好找.

以前QQ没有掌握TCP打洞时也比较恼火,记得那个"通过服务器中传"的提示不?呵呵.
[解决办法]
我要的就是NAT穿透呀```不是要服务器中转的
[解决办法]
需要api hook和了解校验合的计算,挺简单的没什么复杂
[解决办法]
楼上的```说了等于没说```具体点啊```
[解决办法]
如下思路,看一下是否可行:
   服务器知道两用户的IP地址后,发消息给客户端A,将用户B的客户端的IP地址告诉客户端A,让客户端A再直接连接客户端B。
[解决办法]
楼上的思路是正确的``但实际上做不到```因为此时B的端口和S是连接的```不能进入监听状态
[解决办法]
可否再分配一个端口,与每个用户连接都另分配一个端口。
[解决办法]
帮顶!只用过绑定端口UDP协议直接发送消息
[解决办法]
可再分配``但NAT路由几乎都是随机分配的端口``不可能猜到!
[解决办法]
记得有个UDP穿透的论文,你找找看

网上好象没有成品源代码

写是肯定有人写出来,但我个人认为不会有谁愿意将此技术免费发布到网上的.
[解决办法]
我都说了方法,你也了解思路干嘛不自己动手啊
[解决办法]
MARK
[解决办法]
有外网服务端的话,A、B端可以直接主动连接服务器,
然后再服务端再通过这两个连接作中转
[解决办法]
其实只是 一层纸 UDP操作很简单 。。
我继续你的步骤 说如何使用udp打洞

5.服务器告诉A和B双方的真实IP和端口 

6.到这里就不知道怎么让用户A和用户B直接连接了,因为此时用户A或B的WINSOCK端口处于和服务器S的连接状态,怎么才能让A和B在不端开连接或端开连接但端口号不变的情况下让A和B能直接进行连接! 


6.首先 a向b的真实ip和端口 发送一条空命令   
7.首先 b向a的真实ip和端口 发送一条空命令  
8.a可以向b发送真实信息了   ,b也可以向a发送信息了
[解决办法]
内网的路由如何映射..没有把路由映射到你的机器上怎么传输...穿透....还是个问题
[解决办法]
学习了。。。苦恼中。。同样的问题
------解决方案--------------------


一个端口也可以接受多个连接啊。。。不是有个REQUESTID吗,,,用到时来回切换就行了吧
[解决办法]
呵呵,p2p技术,没那么复杂,我说个简单的过程给你理解一下。
比如你和你的朋友都是通过路由器在各自的家上网,这个时候,你朋友在家启动了一个UDP的服务程序。
然后他就用那个UDP服务尝试发了一条信息给一台公网服务器,这样,他变可以看到他的公网 IP 地址和被路由映射过的公网通讯端口,然后他就通过电话告诉你服务器识别出来的IP和端口。这时候你也启动同样的UDP服务程序,用同样的方法得到自己在公网上的IP地址和被映射的服务端口号。
关键步骤开始了:
这个时候你不停的向你朋友告诉你的IP和端口发数据,比如"OK"字符,记住是"不停"的发(最好用程序用死循环的方式做),当然,这个时候你朋友是收不到你发的信息的,当你的程序不停的发数据的时候,你打个电话,让你的朋友向你的公网IP地址和端口发一个数据,比如"yes"或别的什么东西,这时候就完成了整个打洞过程,你们双方都收到了对方的数据。

其实原理和步骤很简单,就是双方都需要通过一台公网服务器得知自己的公网IP地址和被映射过的服务端口,然后其中一方不停的给对方发数据,这个时候,只要另一方也向自己发数据,双方的通道便可打通了。
当然把这个过程写成程序也是很简单的,你就自己实验一下吧。
[解决办法]
可以考虑用服务器来做中转
[解决办法]
是哦,看看时间还真老,呵呵
[解决办法]
这么老的帖子 都发觉出来了 让我回想了当年
[解决办法]

引用:
呵呵,p2p技术,没那么复杂,我说个简单的过程给你理解一下。
比如你和你的朋友都是通过路由器在各自的家上网,这个时候,你朋友在家启动了一个UDP的服务程序。
然后他就用那个UDP服务尝试发了一条信息给一台公网服务器,这样,他变可以看到他的公网 IP 地址和被路由映射过的公网通讯端

口,然后他就通过电话告诉你服务器识别出来的IP和端口。这时候你也启动同样的UDP服务程序,用同样的方法得到自己在公网……


需要不停发吗?
我用了VB 的winsock 控件用 UDP协议做了一个server和client,不成功啊。我先说说我的环境:
s在有公网固定IP,c1和c2分别为两地ADSL拨号后面的路由器后的电脑,
c1和c2不停(每5秒)向S发送心跳包,s记录它们的NAT后的外网IP和端口,并交换告知c2和c1,
现在C1欲发消息给C2,
C1向s发送请求打洞消息,s告诉c2要打洞,c2发送一个打洞包给c1 NAT后的外网IP和端口,c2告诉S已打洞,s告诉c1已打洞,C1发

送消息给c2,过程就是这样,如果超时就重发,重发次数设为的5,可是就是不成功,消息发不出去。

如果C1和c2都在路由后,则打洞不成功,我又测试了一下,如果其中一方做了DMZ(就是有了公网IP),打洞就会成功。不管C1还是

C2做了DMZ都会成功,这排除了路由器不支持锥形NAT的可能。比如C1有公网ip,c1要发消息给C2,c1通过S请求c2向c1打洞后,c1的

消息能正常发给c2,反过来也行。

于是,我又写了个小工具,跟踪调试它们的IP和端口信息,发现个有趣但又无赖的现象:
假如:
s的IP为 8.8.8.8 ,UDP localport 为 8888
c1的ip和端口为:192.168.1.11:1111
c2的ip和端口为:192.168.2.22:2222

c1和C2分别向S端口8888发送心跳包,S得到的:
c1的外网IP为 1.1.1.1 ,UDP localport 为 1111
c2的外网IP为 2.2.2.2 ,UDP localport 为 2222

现在C1欲发消息给c2,c1通过S告诉c2向c1打洞,那么c2还用这个winsock不改变LOCALPORT发送打洞包给1.1.1.1:1111,即:

2.2.2.2:2222(192.168.2.22:2222) --> 1.1.1.1:1111,此时,这个打洞包会被c1的路由器丢弃,根据地球人公布的打洞原理,

此时打洞已成功,C1可以向C2发送消息了,但是:
关键时刻来了:
此时如果c1向C2发送消息时(即:192.168.1.11:1111 --> 2.2.2.2:2222 ),路由器会重新给C1分配端口,即是:1.1.1.1:2342(假

设端口号会变成2342,不再是1111) -->2.2.2.2:2222 ,所以导致打洞失败。但是过一会(超时后,大概3分钟),c1再向C2发送消

息时(即:192.168.1.11:1111 --> 2.2.2.2:2222 ),又会变成:1.1.1.1:1111 --> 2.2.2.2:2222

你可能会说我的路由器是对称型NAT,但是,我想说的是:如果c2不先向C1发送那个打洞包,而先c1向c2发送消息,即:

192.168.1.11:1111 --> 2.2.2.2:2222,那么路由器的映射又是正确的1.1.1.1:1111 --> 2.2.2.2:2222 ,心跳包也是

1.1.1.1:1111 --> 8.8.8.8:8888,即符合锥形NAT现象,看起来就好像是那个打洞包干扰了路由器的映射,所以此时这个c1发向c2

的消息又变相成了c1到c2的打洞包,那c2向C1发消息,外网端口又会被路由器重新映射。


测试了4个路由器,飞鱼星,思科,日立,D-LINK,均是如此,请假各位,问题出在哪里了?


[解决办法]
这种“死贴”应该强制结贴的。
[解决办法]
需要不停地发的,因为会有弃包的处理,时间上对不上就打不通。
[解决办法]
个人感觉是ICMP的原因

热点排行