客户端如果要和服务器做交流,那么肯定需要一套双方都认可的交流方式。比如说我们日常都说普通话,忽然来一个阿拉斯加“”汪汪汪“”的和你说话,这时候,就算你换成英语也没用。必须有一套双方都遵循的交流规则。 也就是 消息协议。
话不多说 上代码
class chat_message {
public:
enum { header_length = 4 };
enum { max_body_length = 512 };
// 包头长度=4 包体长度=512
char *body() { return data_ + header_length; }
//报文指针+包头长度=包体位置
//设置包体长度 如果超过512 裁掉超过部分
void body_length(std::size_t new_length) { body_length_ = new_length; if (body_length_ > max_body_length) body_length_ = max_body_length; }
//data中的数据放入header,分割包头内容,而包头长度+1是为了保存字符串最后一位的‘\0’
如果包长超过512 那么置空
bool decode_header() {
// "5212"
char header[header_length + 1] = "";
std::strncat(header, data_, header_length);
body_length_ = std::atoi(header);
if (body_length_ > max_body_length) {
body_length_ = 0;
//包体长度的信息放入包头
void encode_header() {
char header[header_length + 1] = "";
std::sprintf(header, "%4d", static_cast<int>(body_length_));
std::memcpy(data_, header, header_length);
}
private:
char data_[header_length + max_body_length];
std::size_t body_length_;//真实包体长度
};
通过对消息协议的解析,我们知道包的结构是包头+包体。
而TCP是一个面向字节流的稳定连接服务。因此字节式的包结构,在TCP中传递更加的符合设计。下次我们来解析服务器端对于消息的收发控制。