我的UDP聊天程序 怎样跨越代理服务器 实现不同网端的聊天呢(似QQ通讯)(10分)

  • 主题发起人 主题发起人 lqpg
  • 开始时间 开始时间
L

lqpg

Unregistered / Unconfirmed
GUEST, unregistred user!
我做的UDP程序 可以发送数据到我的网站,
但不能接收从网站发回来的信息
请教高手!感激不尽
我的QQ 29882803
EMAIL:SCPXJD@263.NET
(我的分快没有了 请大家原谅 )
 
我的QQ可以正常运行!
请大家关注我的问题!
 
要跨过网关的,以前讨论过,是利用了网关端口映射的原理。
 
有谁知道网关端口映射的原理,我是出学者!感激各位
有DEMO最好!:)
 
OICQ之间的通迅应该是这样的,当你登录时,会QQ服务器提供你当前所在的IP地址各端口
号,然后当你的好友上线时,就会从QQ服务得到这个IP和Port,以后的通迅才能继续!
上面可能没说得太清楚,下面举个例子来解释,
比如说,你在一家网吧里上网,这个网吧的服器有一个真正的IP地址(可能是临时的--对于
拨号上网;或者是固定的--对于专线上网)比如是61.168.45.120,同时有一个网吧局域网
的IP地址,比如192.168.0.1。而你在该网吧内IP地址为192.168.0.3的机器上用OICQ,当你
上线时,QQ会按你设定的路由发送数据(对于网吧,一般是设IP为192.168.0.3的机器的默
认网关为网吧的服务器,即192.168.0.1的机器)把你所在机器的IP(192.168.0.3)和Port
(一般第一个QQ为4000,二个为4001,依次类推,这时设为4000)通知网吧服器,由于网吧
的服务器(也可说是一个网关)要同时满足多台机器上网的需要,会在它的局域网地址(
即192.168.0.1上)动态的分配一个Port(如 4782)与你通迅,同时再在真正的IP(
即61.168.45.120)上分配一个Port(比如 5472)将你的数据发送到互联网上,这里即为向
QQ服务器发出它的IP和Port(这些都是在网吧服务器上运行的一个代理软件 如WinGate、
SyGate等 所做操作)。
{注意:这个发出的IP是网吧服务器的那个真正IP,Port为相对于这个IP的一个端口(5472)}
现在QQ服务器就把你的QQ当着是在IP为61.168.45.120的机器的Port 5472上运行了,当你的
好友上线时,它就会得到这个IP和Port,然后和你通迅,即把所有发给你的数据都发到
IP为61.168.45.120的机器的5472 Port上,然后网吧服务器上所装的代理软件(比如
WinGate、SyGate等)就会把这些数据通过局域网地址(IP:192.168.0.1,Port:4782)转发到
你所在的机器(192.168.0.3)的相应Port(4000)上,即完成通迅。
其实这中间主要有两个方面 一、就是网吧服务器中的代理,它负则对局域到互联网、互联
网到局域网的数据进行转发。第二,也是关键的一点就是QQ每次上线时会向QQ服务器注册自
己所在的IP和Port,并从QQ服务器中读出在线好友所在的IP和Port信息而进行通讯。当然处
于局域网时这些操作又都是通过网吧服务器中的代理完成的。
(奇怪的是 我为什么收不到由公网发回来的信息呢!)
 
各位兄弟给点建议嘛
我一直在等大家的建议啊
 
要看你用什么代理上网,主要就是HTTP代理(使用TCP连接),socks5(去持UDP和TCP),NAT地址映射(TCP和UDP),HTTP就不说了。如果是socks5,首先你的程序要先用TCP和socks5代理通讯,建立一个UDP端口的映射,由代理返回一个你本机监听UDP端口的端口号,这个号是由代理指定的。比如你本机的UDP服务监听90端口,对应代理上的可能是998(随机的)端口。在你本机取得了代理返回的这个998口号,将它发送给外网的机器,外网的机器就可以通过向代理的998口发送数据,你的本机90端口就可以收到了。通讯期间TCP和代理的联接不能断开,否则代理认为UDP通讯结束了,你的映射端口就没有了。
 
具体怎么和代理通讯,数据包的格式你要找socks5的规范手册查查。
NAT就容易的多了。也是通过一个地址映射,比如你想要外面的机器访问你的本机的90端口,你首先建一个UDPserver开始监听本机的90端口,然后通过本机的UDPserver向外网机器发数据包,外网机器收到包时会取得来源的IP和PORT,这就是经过地址映射后你的器的IP和90端口在NAT盒的地址映射,外网的机器通过身这个收到的IP和PORT发数据你的本地机器就可以收到了。注意的是,NAT映射有超时限制,如果一定时间你没有数据活动的话就会被取消映射,所以QQ要一定时间就发几个包发出去来维持个有映射的活动,可以看看NAT的RFC规范。
解说完毕 给分
 
首先 感谢HAZL的指导,我一定会给分,来表达我的感激之情
但我想做一个类似QQ的东西
QQ是什么原理 来适应不同的代理方式
我想做一个企业内部的聊天系统(在公网上)
最好我DEMO 我是不是太贪心了啊 但实在没有办法 我太菜了 :)
 
我晕,我说的就是使用代理的方法呀。QQ应该也是这么做的,QQ不是有网络设置的选项吗?如果是用HTTP代理的话,QQ客户端直接TCP去连QQ的专用服务器。
如果是socks5或NAT代理就由客户端将用户设置的代理方式(Socks5时代理要发送 取得的代理端口)发送给QQ服务器,这样其它用户就可以通过服务器知道用户的代理方式就可以通讯了。DEMO没有,我一直觉得授之以鱼,不如授之以渔。如果都帮你写好了反倒是害你
 
呵呵~ 请原谅我的无知 因为 我是初学者
但我还是想知道 我的QQ没有设置代理服务器 也能够成功连接
我用的是SYGATE共享ADSL连接
:)
 
如果即没选socks5代理,也没选http代理,而又选的局域网方式上网,哪么QQ认为你是使用NAT映射转换式的代理上网,会自动处理的。
 
sygate也支持NAT的吧
 
既然是NAT,为什么我不能接收到来自外网,发回来的信息呢?
1、我用IdUDPServer在本地(192.168.0.18)监听4001端口,并有IdUDPClient给外网上的计算机(是专业服务器有独立的IP地址)的4001端口发送信息;
2、我用IdUDPServer在外网上的计算机(218.8.8.118)监听4001端口,在接收到信息以后,通过PeerIP和PeerPort取得信息来源的IP和端口,然后发送信息回去,
3、测试结果在外网上的计算机(218.8.8.118)能够成功接收到信息,本地的计算机(192.168.0.18)不能接收到信息
4、留下痛苦和遗憾,还忘给为兄弟,特别是HAZL兄弟,多多关照,兄弟我感激万分
 
NAT的原理我上面不是说了吗,关键是发送数据是不要用UDPclient来发,因为udpclient发送是是随机bind的port,这样通过NAT代理时映射的端口和IP也是随机的,你的服务端收到的就是这个NAT随机映射,你再往这个收到的peerIP和peerPort发东西,会被NAT代理送到你本机的UDPclient发送数据时随机绑定的端口,而你并没有临听这个随机端口。
解决的方法用的IDPserver来发送数据,这样你在NAT的映射就是对应IDPserver的临听端口,外网服务器根据这个映射peerIP和Peerport发回来的数据你的UDPserver才能收的到。
注意的一点时,你的UDPServer要按一定的时间间隔不断的发送数据包,以维护在NAT端的映射端口不超时,否则的话NAT会重新映射的。
 
HAZL 谢谢你
我终于弄好了
但我还是有个疑问
1、QQ是过多长时间给QQ服务器发一封邮件呢?
2、QQ是不是只采用NAT技术来连接呢?
另外、对HAZL表示十二万分的感激![:D]
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部