那位同仁可以给在下讲讲QQ的原理,如有代码更佳

解决方案 »

  1.   

    QQ在登录时会把本机的IP+端口号,报告给公网上的QQ服务器,如果是在局域网内,报告的是网关IP+端口。也就是说内网计算机的IP+端口,映射到网关IP+端口上。
    QQ服务器会向每个QQ客户端发送上面提到的IP(或网关)+端口的列表,这样2个QQ的客户端就可以直接通过IP+端口方式通信了。一个IP+端口表示一个sock通过这个sock就可以表示一个主机。
      

  2.   

    瞎说说:p如果对方不在线的时候就把消息存在服务器上,当对方上线通知了服务器.服务器就把消息告诉对方.具体的要用到winsocket.
      

  3.   

    我现在不明白的是,内网通过代理的机器,它是如何确定IP的。它可以用网关的IP代替,但是它转到网关的时候,网关又如何知道该把信息发给谁?
      

  4.   

    在网上找到的:
    一、腾讯公司的OICQ就是使用UDP协议进行发送和接收“消息”的。当你的机器安装了OICQ以后,实际上,你既是服务端Server,又是客户端Client。OICQ的工作原理是:当你登录OICQ时,你的OICQ作为Client连接到腾讯公司的主服务器上,当你“看谁在线”时,你的OICQ又一次作为Client,从腾讯的Server上读取在线网友名单。当你和你的OICQ伙伴进行聊天时,如果你和对方的连接比较稳定(能Ping通、有稳定的Echo),你和他的聊天内容都是以UDP的形式,在计算机之间传送。如果你和对方的连接不是很稳定(干脆就Ping不通、或数据断断续续,腾讯公司的sz.tencent.com服务器将为你们的聊天内容进行“中转”。如果你使用了Socks5代理服务器的话,你到腾讯服务器的信息将通过这个Socks5代理进行“中转”。      二、当OICQ的服务器收到此登录数据包以后通过验证,服务器将反馈给你一个数据包,这里你的OICQ就上线了。 OICQ上线以后,每隔一段时间服务器向你发送一个数据包,上面有你好友的IP和号码,用此来表示你好友在线的情。你同时也反回一个数据包给服务器。里面当然也包括你的IP了。表示你在线。如果你没有反回一个数据包给服务器,那么就表示你不在线了,这时你在你的朋友的OICQ上就不在线了。      三、转发。根据服务器发送来的给来的数据包知道你好友在线的IP,然后当你向好友传送消息的时候,就是根据好友的IP通过UDP协议向对方发送数据包,对方机子上的OICQ收到的你的数据包的时候就反馈一个数据包给你表示已经收到你的消息,否则的话就一直发送。 等到对方反馈数据包为止。当到一定时候对方一直没有反馈数据包给你的时候,就通过服务中转。中转的原理是这样的,将数据包给腾讯的服务器上,由服务器又将数据包发到对方的机子上,这就是通过服务器中转的工作的原理。 试问如果我和我的网友在两个不同的网吧上网聊天,网吧都是通过ADSL接入上网的,在外面看来,我们的IP地址是网吧的代理服务器地址,那么,UDP数据报怎样发过去,无论是服务器中转还是两个客户端对传,好像都没有办法。但事实我们在通信,而且很正常。清高手指点。________________________________________________________________________有兴趣的你可以具体参考一下NAT协议.我做很简单的描述,假设代理服务器维护这样一个表项:--Server--------Proxy---------QQhost---服务器地址      外部网IP  内网IP    内部主机服务器监听端口    外部端口  内网端口   内部端口 对于内部不同主机,代理服务器使用不同的外部端口唯一对应.QQ启动时,服务器将登记QQ所在的外部网IP和外部端口,这样就可以区分不同的QQ.
    ________________________________________________________________________ 举例:lan1上的机器A,192.168.0.10,其代理服务器pa为202.96.0.10
    lan1上的机器B,192.168.1.11,其代理服务器pb为202.96.1.11server为202.96.2.20A向S的某个固定端口发一个udp包,该包被pa截获,并为其分配一个端口20400,将udp包中的源地址和源端口改为202.96.0.10和20400,再发给S,S就得到A的通信地址: 202.96.0.10 : 20400同样的方式得到B的通信地址,202.96.1.11: 20102,然后S再将A的通信地址发给B,即将信息202.96.0.10+20400发向202.96.1.11: 20102,pb将完成转发。此后B可以向A的通信地址202.96.0.10+20400发udp报文,A可以直接收到。也就是说,服务器的作用是获取双方的代理地址和端口并转达该信息。代理服务器(如wingate、sygate)负责完成这种报文替换的工作,前提是lan上的机器必须把代理服务器当作网关,这样代理程序将可以通过底层方式直接接管网卡报文的收发,在得到要求自己转发的报文时,它会将该报文提取出来,如tcp/udp/icmp等不同类型,采用不同的方式替换掉报文中的源地址和源端口信息,同时本地也要分配一些转发资源。
      

  5.   

    具体代码没有,不过类似的代码倒有,给个地址你去下吧
    http://www.anyq.net/rjxz.htm