对于QQ的在线状态是如何实现的
对于QQ的在线状态是怎么实现的?
当QQ在线时候应该是建立了一个线程对服务器进行心跳测试,一旦QQ下线(无论是正常关闭程序还是一场结束程序),服务器收不到QQ发来的消息立即向其他用户发送通知,那这个机制是采用UDP群发还是TCP群发呢(我不清楚是遍历用户发送还是可以像广播那样发送)?我现在做了一个类似QQ的聊天程序基于UDP的,create选中数据包后利用sendto发送消息时候不知道参数怎么填写,MFC是这样写的:
说明:
对于数据报套接字,SendTo的成功结束并不意味着数据一定成功地发送到了目的地。
由参数lpSockAddr指明具体目标套接字发送数据报时,SendTo仅用于SOCK_DGRAM型的套接字。
发送广播数据(仅用于SOCK_DGRAM型的套接字),参数lpSockAddr指明的地址应该由一个特殊的IP地址:INADDR_BROADCAST(它在Windows Sockets的头文件WINSOCK.H中定义)和相应的端口号构成。此外,如果参数lpszHostAddress为NULL,则套接字也用于广播发送。数据报的数据部分不能超过512字节,因此广播的数据报最好不要超过这个数字,以避免数据的分割。
是不是IP地址这里填写NULL,如果是填写NULL,那么发送的数据是向某一个网段广播还是整个广域网广播呢?
真诚谢谢各位的回答!
------解决方案--------------------
广播的数据是在局域网内广播,包经过路由器时会被丢弃
类似于QQ,用户散布在不同公网下的局域网,一般遍历用户发送
------解决方案--------------------
------解决方案--------------------
QQ的在线好用有许多的策略,在登陆的时候会去读取一次好友列表信息,但不是全部的好友信息,如果读取一个用户的全部信息,登陆会很慢,所以在登陆过程中会选择部分重要信息,比如在线状态。比如其他的QQ空间信息,会在登陆后,再进行更新。
好友在线状态,我也研究过一阵,我一台电脑开2个QQ,互加好友,如果没有通讯,一个QQ下线,用户信息也不是立刻更新,但有时候也会立刻更新。
个人觉得,当一个用户如果是正常下线,服务器检测到后会将这个信息群发给在线的好友,当然QQ这样庞大的用户群体,会有延迟也是很正常,一定是用到了缓存队列的设计。
------解决方案--------------------
不错的讨论帖,推荐一下
------解决方案--------------------
个人觉得,当一个用户如果是正常下线,服务器检测到后会将这个信息群发给在线的好友,当然QQ这样庞大的用户群体,会有延迟也是很正常,一定是用到了缓存队列的设计。
------解决方案--------------------
偶觉得,QQ应该过一段时间,读取一下好友成员在线状态
QQ服务器上,对应QQ号,应该有一个状态信息
服务器有一段时间没有收到QQ数据,就表明该QQ断线,将状态改为“离线”
而其他QQ客户端每过一段时间,就读取一下好友的在线状态
------解决方案--------------------
qq使用的肯定不是广播,广播无法通过路由。感觉应该是每个用户维护者一张好友列表,直接向好友发送信息
当QQ在线时候应该是建立了一个线程对服务器进行心跳测试,一旦QQ下线(无论是正常关闭程序还是一场结束程序),服务器收不到QQ发来的消息立即向其他用户发送通知,那这个机制是采用UDP群发还是TCP群发呢(我不清楚是遍历用户发送还是可以像广播那样发送)?我现在做了一个类似QQ的聊天程序基于UDP的,create选中数据包后利用sendto发送消息时候不知道参数怎么填写,MFC是这样写的:
- C/C++ code
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,那么发送的数据是向某一个网段广播还是整个广域网广播呢?
真诚谢谢各位的回答!
------解决方案--------------------
广播的数据是在局域网内广播,包经过路由器时会被丢弃
类似于QQ,用户散布在不同公网下的局域网,一般遍历用户发送
------解决方案--------------------
------解决方案--------------------
QQ的在线好用有许多的策略,在登陆的时候会去读取一次好友列表信息,但不是全部的好友信息,如果读取一个用户的全部信息,登陆会很慢,所以在登陆过程中会选择部分重要信息,比如在线状态。比如其他的QQ空间信息,会在登陆后,再进行更新。
好友在线状态,我也研究过一阵,我一台电脑开2个QQ,互加好友,如果没有通讯,一个QQ下线,用户信息也不是立刻更新,但有时候也会立刻更新。
个人觉得,当一个用户如果是正常下线,服务器检测到后会将这个信息群发给在线的好友,当然QQ这样庞大的用户群体,会有延迟也是很正常,一定是用到了缓存队列的设计。
------解决方案--------------------
不错的讨论帖,推荐一下
------解决方案--------------------
个人觉得,当一个用户如果是正常下线,服务器检测到后会将这个信息群发给在线的好友,当然QQ这样庞大的用户群体,会有延迟也是很正常,一定是用到了缓存队列的设计。
------解决方案--------------------
偶觉得,QQ应该过一段时间,读取一下好友成员在线状态
QQ服务器上,对应QQ号,应该有一个状态信息
服务器有一段时间没有收到QQ数据,就表明该QQ断线,将状态改为“离线”
而其他QQ客户端每过一段时间,就读取一下好友的在线状态
------解决方案--------------------
qq使用的肯定不是广播,广播无法通过路由。感觉应该是每个用户维护者一张好友列表,直接向好友发送信息