二、客户端
- 登录功能的话是
发送登录数据包sendLogin()
,那么获取用户列表也要发送列表数据包sendList()
——
- 客户端接下来处理服务器回复的
列表应答包
- 接下来
解析列表应答包
——
- 难点:
【用户列表】
不能只发一次,需要定时器
来实现发多次列表
——
1.2 定时器
- QTimer
当时间到的时候,就触发sendList()
函数(这里并不是服务器直接推送到各用户上,而是一个应答服务器
)
- 所以我们在
登录成功,拿到ID
后,启动定时器
即可——
- 为了列表
不出现重复
的情况,我们要将列表清空
——
二、服务器端
- 要把
在线用户的ID
全部返回,所以要事先保存一下ID,可以将ID保存在链表
中
每当一个用户进来,就在链表中插入一个节点
- 创建
链表头节点
可以在结构体node中扩展,比如加入
buf
,加入name
这些,我们的话这里就加入套接字socket
即可——
ID
就是套接字
- getlist()函数会传入
buf
和buf的大小
将整个
用户列表
都填入到buf
中
4个字节
为一个单位
的拷贝,将socket套接字
拷贝到tmp缓冲区
中,然后再将tmp
填入buf
中去,不断循环,直到链表结束
。(往buf中填充所有的在线用户ID)
-
insertList()
插入新的节点 -
findList()
根据套接字来查找对应的节点 -
findList()
主要用于删除节点的时候(deleteList()
),遍历,然后删除
2.2 加入链表到服务器中
- 在
listen调用
后,通过create_head()
生成head头节点
- 【连接】创建成功后,插入新的节点
insertlist()
这里我们登录成功后,就
插入新的节点(文件描述符)
——
- 删除节点的时机——关闭连接的时候
- 插入和删除都完成后,就是
解析【获取列表】命令
将send_buf传进去得到用户列表,然后send_buf在getlist()返回后,send_buf中就存储了
用户列表的数据
——
getlist()返回的是往send_buf中一共写了多少个字节
- 接收数据的代码逻辑——
当跳出内层循环后,意味着这个套接字clntfd
已经没用了,我们就关闭它,删除它。也意味着当前这个用户
已经无效,可以去accept()接收其他用户的三次握手请求
了。