一、客户端登录
首先,信号与槽机制——login()
,然后就是connected()
然后,相当于现在已经登录成功
了,那么我们就开始发送【登录信息】(login()
中调用sendLogin()
)——
对应的函数是sendlogin()
,实现中使用_socket
将buf
中的内容写过去——
-
sendLogin()
结束之后,就需要开始读服务器响应的应答包
了
当
服务器的应答包数据
到达客户端的时候,会有一个信号readyRead()
到来。为了应对这个信号,我们写一个槽函数recv()
来读到来的数据——
注意
append
是追加,而不是直接覆盖缓冲区。当数据包读对以后,调用analyze()函数
来分析数据包。将recv_buf
中的数据传入analyze()后,还要对recv_buf
进行处理,【后面的数据】不能直接清空,而是截取【后面的数据】重新赋值给recv_buf,然后进入死循环while(1)
analyze()
使用QString来保存ID
- 难点:解析含有
垃圾数据包
,粘包的问题
二、服务器
-
ret = 0
意味着客户端关闭了连接,服务器则continue
,回到循环开始继续accept()
-
ret = -1
,线程通信的时候不能用perror,因为read()
就会重置errno,会冲突,所以用printf()就好
2.1 接收登录数据
- 打印下
字节数
来确定收到了数据包
——
- 读到数据包,打印完字节数后,意味着我们可以来
解析数据包analyzeData()
了——
recv_buf
中存储的是接收到的数据
,然后根据recv_buf
中的内容来填写send_buf
中的内容
然后对于登录信息
,需要回复一个ID
,这个ID是唯一
的,所以我们可以使用文件描述符
来代替
- 解析完
数据包
后,再直接发送应答包
,发送应答包则是直接调用write()