对于QQ的在线状态是怎么实现的?

myanbu2008 2012-02-24 08:57:53
加精
当QQ在线时候应该是建立了一个线程对服务器进行心跳测试,一旦QQ下线(无论是正常关闭程序还是一场结束程序),服务器收不到QQ发来的消息立即向其他用户发送通知,那这个机制是采用UDP群发还是TCP群发呢(我不清楚是遍历用户发送还是可以像广播那样发送)?我现在做了一个类似QQ的聊天程序基于UDP的,create选中数据包后利用sendto发送消息时候不知道参数怎么填写,MFC是这样写的:
   
int SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 );
int SendTo( const void* lpBuf, int nBufLen, const SOCKADDR* lpSockAddr,int nSockAddrLen, int nFlags = 0 );

说明:

对于数据报套接字,SendTo的成功结束并不意味着数据一定成功地发送到了目的地。
由参数lpSockAddr指明具体目标套接字发送数据报时,SendTo仅用于SOCK_DGRAM型的套接字。
发送广播数据(仅用于SOCK_DGRAM型的套接字),参数lpSockAddr指明的地址应该由一个特殊的IP地址:INADDR_BROADCAST(它在Windows Sockets的头文件WINSOCK.H中定义)和相应的端口号构成。此外,如果参数lpszHostAddress为NULL,则套接字也用于广播发送。数据报的数据部分不能超过512字节,因此广播的数据报最好不要超过这个数字,以避免数据的分割。

是不是IP地址这里填写NULL,如果是填写NULL,那么发送的数据是向某一个网段广播还是整个广域网广播呢?

真诚谢谢各位的回答!
...全文
10237 149 打赏 收藏 转发到动态 举报
写回复
用AI写文章
149 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen870201 2012-03-04
  • 打赏
  • 举报
回复
QQ还是很强大滴
HAHSIYUAN 2012-03-04
  • 打赏
  • 举报
回复
我觉得就像是一个用户发送消息给所有他的好友一样把自己的状态更新信息发送给每一位好友就完了。。。。没那么复杂吧。。。。
zm518 2012-03-04
  • 打赏
  • 举报
回复
百度可以搜索出来
poolao 2012-03-03
  • 打赏
  • 举报
回复
INADDR_ANY这个东西,貌似就像于0.0.0.0那我是不是可以sendto到0.0.0.0呢?
流星陨落 2012-03-03
  • 打赏
  • 举报
回复
搞不懂啊。。。
fl19911201 2012-03-03
  • 打赏
  • 举报
回复
我也很好奇
xxbd123 2012-03-02
  • 打赏
  • 举报
回复
做个实验 开两个QQ 互为好友 同时在线 其中一个正常关闭 另一个显示对方马上下线

可如果是KILL进程 就会有延时
  • 打赏
  • 举报
回复
之前玩的时候写过一个聊天程序,采用的是服务器推送的方式, 用户上线或下线服务器都会知道,用户和用户之间如果建立过好友关系会有数据库记录,只要给与上线或下线的用户建立关系的在线的好友推送一条消息出去就行了,客户端更新UI就行了。QQ的不知道咋弄的
NewUser2008 2012-03-02
  • 打赏
  • 举报
回复
我觉得应该是用户每隔一段时间自动向服务器获取用户信息
zsedcqwaa 2012-03-02
  • 打赏
  • 举报
回复
QQ已经完善的很好了?以前漏洞多啊。。
quit085 2012-03-02
  • 打赏
  • 举报
回复
不赖!
tanya506 2012-03-02
  • 打赏
  • 举报
回复
看到各位的评论,长见识了。
impasse 2012-03-02
  • 打赏
  • 举报
回复
没有根据,我想的
比如说有10万个QQ号,建立10个数据库,一个数据库分别处理一万个在线状态

QQ号1上线,每3秒读取自己好友列表的在线状态,号码1开头的QQ号的就在数据库1中,2就在数据库2中,这样分流处理减少压力。
QQ号5秒发一次消息给服务器,比如说发一个"OK”,这时数据库上的数据显示号码1在线。而正常下线时向服务器发一个消息如"OVER”,服务器将号码1标识为不在线。
这是正常上下线,而不正常下线怎么检测呢,服务器会在大于6秒没有收到OK消息时就将该号码标识为离线。

QQ消息都是通过服务器转发的,这点我知道,而当两个人要传送文件或发送图片时才会建立两台电脑的连接。也就是这时能追查到对方的IP地址。
yinyuzuo521 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 myanbu2008 的回复:]
刚才看一下INADDR_ANY这个东西,貌似就像于0.0.0.0那我是不是可以sendto到0.0.0.0呢?
[/Quote]

这个你可以尝试下,但是一般情况下最好不要猜测,网上关于这方面的评论挺多的,多学习大家的经验
e3internet 2012-03-01
  • 打赏
  • 举报
回复
所有关系用户都要通知的,至于怎么实现。只有等小马走后 会做出解释的。
  • 打赏
  • 举报
回复
我觉得应该是有一个在线集群的,它们的硬盘不大,但是内存和CPU都很强悍。通过hashtable或hashmap来存储在线用户,并且用懒的轮询心跳包来确认用户的连接。这样查找在线用户的速度应该会比较快。发送消息会先查找在线用户表,获取用户的IP,建立UDP连接,存在则直接发送并期望收到确认回复,不存在则发到离线消息服务器中(隐身用户也应该是离线消息)。而正常的上下线都是向自己的好友广播消息的,在线用户通过客户端之间的心跳来减轻服务器负担。。。也就是说,假如客户端之间的心跳测试不成功,会报告给服务器,然后服务器去对客户端做心跳测试,不成功的时候就认为该用户离线了。
仅仅是个人观点哈
微笑微笑 2012-03-01
  • 打赏
  • 举报
回复
你说的一段时间到底是多少时间?反正在我的印象里面好友一下线都是立刻显示不在线的
[Quote=引用 16 楼 ribut9225 的回复:]

偶觉得,QQ应该过一段时间,读取一下好友成员在线状态

QQ服务器上,对应QQ号,应该有一个状态信息
服务器有一段时间没有收到QQ数据,就表明该QQ断线,将状态改为“离线”
而其他QQ客户端每过一段时间,就读取一下好友的在线状态
[/Quote]
yinxu 2012-03-01
  • 打赏
  • 举报
回复
我想应该不需要遍历:如果我下线了,服务端记录我下线的信息,在我的好友发送心跳包到服务端的时候,服务端通知下就可以了,这样不需要额外的去循环发送。
yinxu 2012-03-01
  • 打赏
  • 举报
回复
我想应该不需要遍历:如果我下线了,服务端记录我下线的信息,在我的好友发送心跳包到服务端的时候,服务端通知下就可以了,这样不需要额外的去循环发送。
cmm890915 2012-03-01
  • 打赏
  • 举报
回复
值得研究一下~
加载更多回复(90)

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧