因为tcp是数据流。所以1段数据可能会被分开发送或者接收,这样在服务器接受以后就存在1个问题。如何确认获取到的协议完整性?
这就需要服务器粘包处理。
C++游戏服务器协议部分一般都是采用 包长+协议号+数据
通过读取2或者4个字节包长,根据包长从数据流中提取固定长度的内容,然后判断协议号,对应到struct以后提取数据。
想一下最终决定采用json格式。
协议
提交部分
{
"lentgh":12,
"action":"register",
"username":"watsy",
"password":"123456"
}
其中length为整个json的长度
action为方法。
剩下的为提交的字段
返回
{
"status":1,
"errcode":0,
"action":"login",
"datas":{
"uid":1,
"name":"watsy",
"head":"xxxx.jpg",
"description":"hello world",
"token":"abcdefghikklmnopqrstuvwxyz"
}
}
服务器端发送与返回一致。
action - 方法
e

本文介绍了在使用TCP协议时,由于数据流可能导致数据被分割发送和接收,从而需要进行粘包处理的问题。文章提出了C++游戏服务器常用的包头(包长+协议号)设计,并决定在Python聊天服务器中采用JSON格式来定义协议。服务器端接收到数据后,通过搜索包长来提取完整协议,并依据action进行反射操作,以解析和处理协议。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



