CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

!!!!讨论OICQ的实现方法

楼主playpcgame(修罗王)2000-09-10 20:16:00 在 VC/MFC / 基础类 提问

请大家讨论OICQ的实现方法,如体系结构,负载均衡,消息的传递,各版本之间的协同等等。分数多多,不够可以再加!! 问题点数:300、回复次数:41Top

1 楼Areslee(懒虫易水)回复于 2000-09-10 21:10:00 得分 0

关注Top

2 楼phf(tonight,I don't cry)回复于 2000-09-10 21:34:00 得分 0

关注!Top

3 楼Holly()回复于 2000-09-10 22:19:00 得分 0

??Top

4 楼flying_duck(飞天鸭子)回复于 2000-09-10 22:51:00 得分 0

我知道很少,感觉应该是用异步Socket编的吧。  
  还有一点,有时候聊天记录里可以看到“(通过服务器中转)”,是什么意思?Top

5 楼Beachboy()回复于 2000-09-10 23:08:00 得分 0

OICQ在传送在线好友名单的时候,会把对方的IP地址传过来的,在聊天的时候,消息是不通过服务器,而直接发送到对方OICQ中,但在网络出现问题时,OICQ在连续发送N送后都不成功的情况下,会自动发送到OICQ服务器,然后发送给你好友的OICQ中。  
   
  我猜的!Top

6 楼yaly()回复于 2000-09-11 06:33:00 得分 0

关注  
  Top

7 楼oldworm(oldworm)回复于 2000-09-11 09:04:00 得分 40

oicq在实现时有一个问题不知道各位有没有注意,就是现在联网的用户有20多万,正常情况下socket可用的端口是个WORD(windows下是UINT),所以范围是有限的6万多个,也就是说现在20多万在线用户的情况下必须要作一个技术转换,该技术我和好友讨论过,可能有以下几种情况:  
  一、使用动态解析DNS,解析成不同的IP地址,最简单如按序轮转。  
  二、使用接入服务器,统一管理用户接入,然后分配给其它服务器进行处理,其它服务器可以反向联系用户。  
  三、使用硬件如网关,在它上作文章,具体做法我不是很清楚。  
  Top

8 楼luxes()回复于 2000-09-11 09:27:00 得分 0

attentionTop

9 楼playpcgame(修罗王)回复于 2000-09-11 09:47:00 得分 0

我个人的感觉是OICQ是一个设计得很成功的软件。好像在2个月前他们还在庆祝在线人数突破10万,可是现在却经常有30万人在线,仍然能保证高速稳定的运行。这样的设计值得我们大家学习探讨。  
  非常欢迎各位高手踊跃发言!Top

10 楼Holly()回复于 2000-09-11 10:20:00 得分 20

to   oldworm:  
  一个端口可以支持许多用户,用户的多少只影响对单一用户的响应速度,用一个或几个线程排队处理一个端口的数据;实际上端口数并不是用户数!Top

11 楼netsong(Edwin)回复于 2000-09-11 10:25:00 得分 40

当你用portscan监测端口的时候,会发现oicq用的是udp协议,并且带有反馈信息(这让才能  
  让服务器知道转接),并且和服务器定时握手,大概几秒钟一次,可是这么大的在线人数,怎  
  么能行?是不是也象oicq一样,用的服务器群?  
  确实,oicq的服务端设计得很棒。Top

12 楼netsong(Edwin)回复于 2000-09-11 10:37:00 得分 0

Holly说得很有道理,可是算算:假设在线10万人,每人每分钟要向服务器发3次握手信息(用以确定用户是否在线),这就是说服务器要每分钟接收30万udp包,发送30万udp包,这是最基本的,同时还要应付许多查询,要和数据库打交道......这些很占资源呀。  
  再说,服务器开多少个线程才算合适呢?Top

13 楼haitian99()回复于 2000-09-11 11:33:00 得分 40

我用几个防火墙软件检查了一下OICQ客户软件的运行情况.发现:  
  1.   OICQ和在线的好友聊天,用的是UDP,   端口一般是4000,运行多个实例,端口号再向上增加,  
        不过,我也发现有的好友的IP的端口号是1xxx,我不知道为什么.也许他们用的是一些自己     编写得客户软件,ICQ炸弹也说不定  
   
  2.   通过和服务器szptt170.szptt.net.cn:8000   (202.96.170.0-202.96.170.255)保持一直连接状态.得到在线好友的信息.我搜索了一下,szptt170.szptt.net.cn对应了255个IP地址.他的服务器到底有多少台?所以能支持这么多用户.  
  3     通过和服务器tadsoi.tencent.com:80联系,   不知道在作些什么.哪一位兄弟出来指点.  
   
  Top

14 楼ljv_23(老兔八哥)回复于 2000-09-11 11:38:00 得分 0

我也想知道。Top

15 楼darkwing()回复于 2000-09-11 11:50:00 得分 30

对应了255个IP地址不一定要很多服务器啊,  
  一台机器也可支持的,更何况它们的服务器是UNIX的。  
  3     通过和服务器tadsoi.tencent.com:80联系,是读广告条的信息!  
  真想屏蔽掉.Top

16 楼haitian99()回复于 2000-09-11 12:25:00 得分 0

我也知道一台主机可以绑定多个IP地址.  
  我的意思是说腾胜的硬件设施也很利害.  
  要想屏蔽广告条,太好办了.  
  用ATGUARG   就可以.  
   
   
  Top

17 楼pxq(风轻轻地吹)回复于 2000-09-11 12:27:00 得分 0

关注Top

18 楼Sodar(小猪菜菜)回复于 2000-09-11 13:20:00 得分 0

关于这个我想说两句。。。Top

19 楼Sodar(小猪菜菜)回复于 2000-09-11 13:29:00 得分 0

其server端用的是udp服务,所以不存在套接字端口不够用的情况。普通的消息发送是用udp,传送文件和二人世界用的是直接tcp连接。  
  上面haitian99兄所说的1xxx端口是因为该用户是用的socks5代理服务器。  
  总之,这个服务端做的很不错。  
  Top

20 楼fourway(fourway)回复于 2000-09-12 09:37:00 得分 0

关注  
   
  Top

21 楼Sodar(小猪菜菜)回复于 2000-09-12 14:08:00 得分 0

to   zhonglei:  
   
  socks4提供connect和bind功能,具体说来connect就是内部主机可以通过socks4代理连接到远程主机,bind命令是向代理服务器申请绑定一个端口,然后把代理绑定的端口通过某种手段通知远程主机,远程主机可以向代理发起一条连接,在代理的作用下,相当于直接连到内部主机。这在使用port命令的ftp软件中经常会遇到。  
  socks5比socks4改进之处是增加了udp   association功能,内部网络用户可以通过该功能与外界主机进行udp数据包的收发。oicq中最常用的就是这一功能。  
   
  Top

22 楼jansenzhu()回复于 2000-09-12 14:55:00 得分 0

listen.Top

23 楼biner()回复于 2000-09-12 15:01:00 得分 0

关注Top

24 楼coolcode()回复于 2000-09-12 23:59:00 得分 0

我想谈谈OICQ的另一面,嘿嘿.  
        其一.OICQ各种功能都考虑得很周到.却惟独没有此类软件普通存在的自杀(UnRegister)功能.  
  目的何在?很明显是为了用户数目只增不减.要知道,用户群是此类网站的存在的基础啊.  
        其二,您有几个OICQ号?3个?4个?还有您早就忘掉的号哩?OICQ号称注册用户1000万.该打多大的折扣?  
        .......  
   
       
         
  Top

25 楼sungang()回复于 2000-09-13 01:02:00 得分 0

关注Top

26 楼shines(郭子)回复于 2000-09-13 02:26:00 得分 20

如果你用UDP探测器侦测会发现,OICQ客户端每一分钟与服务器握手一次,发送UDP   Msg时每   3秒发送一次,不断重复,直到对方接受后把已接受的信息发送回来,发送框方才消失。  
   
  如果客户端是169需要服务器中转发送信息。  
  如果是从169传文件到163用户,就根本不可能,因为他们是直接的TCP/IP连接,连接不上。  
   
  至于端口嘛,客户端默认是4000,如果占用则随机更换一个,所以如果你发现端口号是1XXXXX以上的,极有可能是来自169网的,因为169的所有用户是共一个IP,而端口不同罢了,有点类似一个网吧的局域网,只不过此网吧的规模大了许多。如果是1XXX,则有可能是用代理上的。  
   
  以上仅供参考。Top

27 楼shines(郭子)回复于 2000-09-13 02:31:00 得分 0

更正:   是1XXXX,   not   1XXXXXTop

28 楼homesoft()回复于 2000-09-13 10:31:00 得分 0

关注  
  Top

29 楼solver(天草)回复于 2000-09-14 14:27:00 得分 0

关注  
  Top

30 楼flywhc(午夜蓝调)回复于 2000-09-14 17:12:00 得分 60

刚好前一段做完了一套类ICQ系统  
  其实OICQ从内核上看还不完善   --   至少我觉得不如ICQ好。  
   
  OICQ用的UDP和TCP混合编程。我开始以为TCP比较好,比较稳定,  
  只是稍占资源,服务器端编程困难一些;后来在PROXY后面做测试才发现  
  UDP协议的好处   --   多数PROXY软件都支持UDP   MAPPING,这样根本无需什么SOCK4、5  
  就能连出去了。要想支持TCP,必须用SOCK5,一种很“麻烦”的协议,每次建立一个  
  连接都要建立另一个与SOCK5端口的确认、请求、分配等手续。  
  于是在单位里用OICQ最麻烦的就是在PROXY后面不能传文件(因为用的TCP协议)  
   
  于是我把所有TCP协议都干掉了,全部用一个UDP   SOCKET收、发,特省资源。CLIENT的PORT  
  没必要规定,随机分配就好。这样只要网管开了8000端口,程序根本不用区分是在PROXY外面还是里面。但UDP协议太不稳定了,丢、重、错包都常常发生,必须自己定义数据包格式,必须加校验,必须加时间戳判断。数据重发应该更智能一些,不该是3秒一次。尤其对于文件传输,国内的ICQ系统都做的不怎么样,太慢了,没有自动调速自动续传的机制,应该好好看看ZMODEM之类的算法。  
   
  关于服务器端的线程,目前我还是用单线程,因为非阻塞方式的网络操作很快,数据库也很快,甚至可以忽略。如果用户量很巨大,可以用分布式的,把一台服务器做专门的数据库服务器。至于如何把负载分到各个服务器上,我不懂网络通讯,但我的办法是在client有个服务器列表   --   甚至可以自动更新,登录时向各服务器发请求,哪个先回认为哪个最快;当连不上时自动切到另一个再试;并自动调整顺序。以前的ICQ好象就是这么干的,现在的不知道。  
   
  确定某用户是否在线、离线,除登录时由服务器刷新告之外,比较好的算法是由好友“主动”的告诉client   --   细心的可以发现,如果强制断线的话,ICQ上的用户1分钟仍然在线,如果选“OFFLINE”则立刻掉下去。Top

31 楼kingwill(周二球)回复于 2000-09-15 09:28:00 得分 0

attentionTop

32 楼potatopro()回复于 2000-09-15 10:00:00 得分 0

  Top

33 楼playingmygame(射手)回复于 2000-09-15 16:16:00 得分 0

take   care^_^Top

34 楼netsong(Edwin)回复于 2000-09-18 10:50:00 得分 0

怎么没人讨论了?Top

35 楼raincy(咕咚)回复于 2000-09-19 00:39:00 得分 20

基于tcp的设计应该是编起来比较方便,除了第一次连接建立的时候比较慢,  
  以后的消息发送的速度是有保障的,所以在点对点的聊天的时候,采用tcp连  
  接应该是一种不错的选择.  
  至于服务器采用udp连接,我觉得可能适因为服务器端为保留太多的tcp信息  
  而使系统的运行效率下降.采用udp在这个时候有明显的优势.Top

36 楼dcrwy(无翼)回复于 2000-09-19 09:58:00 得分 20

我的观点:  
  1.实际上用TCP可能更安全些,但是UDP更适合聊天软件。  
  2.OICQ与客户端的不断联系可能是通过一台专用服务器。  
  3.一个端口足够了,可以使用进程、线程。  
  4.OICQ还有很多缺点  
  5.无商不奸,如果有自杀功能了,那。。。Top

37 楼Putao(掌门大师兄)回复于 2000-09-19 13:04:00 得分 10

OICQ得成功不仅是因为软件写得好,还有强大的网站支持Top

38 楼wuzhouqun(Peter Wu)回复于 2000-09-23 10:04:00 得分 0

关注!Top

相关问题

  • 讨论:Acess anywhere的实现方法
  • 类似OICQ界面的实现方法?
  • CInternetSession与https的问题,讨论实现方法也有分
  • 【讨论】 AddOrder 方 法 应 由 哪 一 个 类 来 实 现 呢 ???
  • 〓〓讨论〓〓→→→→长文章分页的实现方法。←←←←
  • 实现OICQ风格窗体的方法!请教高手!!!!!!急!!!!!!!!!!!!
  • ××××××讨论ListBox的用法!如何实现类似Oicq中的效果!××××
  • OICQ的思想与实现的讨论!(见解有分,会不断加分)
  • 欢迎大家热烈讨论Notes中的打印报表实现方法!
  • 200分讨论用VC实现浏览XML文件的思路, 方法!!!

关键词

  • .net
  • 服务器
  • 端口
  • 用户
  • 主机
  • 连接
  • tcp
  • 协议
  • 软件
  • ip

得分解答快速导航

  • 帖主:playpcgame
  • oldworm
  • Holly
  • netsong
  • haitian99
  • darkwing
  • shines
  • flywhc
  • raincy
  • dcrwy
  • Putao

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo