Tcp 协议定制
TCP 面向字节流
Tcp 三次握手 四次挥手
connet 发起建立连接
accept 最后用来接收连接 三次握手四次挥手发生在传输测 其余的部分 都是由操作系统自主完成
我们决定什么时候发生 在 close
的时候结束
建立连接 通过三次握手的手段
操作系统将建立的所有连接管理起来
tcp vs udp
可靠 vs 不可靠
有连接 无连接
字节流 数据报
TCP协议
报文边界
TCP是面向字节流的协议,需要明确报文的边界。
确定报文边界的方法
定长:每个报文固定长度。
特殊符号:使用特殊字符标识报文结束。
自描述:报文包含描述其长度或结构的信息。
TCP缓冲区
发送缓冲区:数据从应用层拷贝到TCP发送缓冲区。
接收缓冲区:数据从TCP接收缓冲区拷贝到应用层。
全双工通信
TCP支持全双工通信,即数据可以同时双向传输。
定义
协议:一种约定,用于规定数据的格式和传输规则。
协议定制
在读写数据时,数据以字符串形式发送和接收。
结构化数据传输需要定制协议。
数据序列化
序列化
定义:将结构化数据打包成字符串(字节流)的过程。
反序列化:将收到的字节流还原为原始数据结构的过程。
数据发送接收
发送函数的本质是将数据从发送缓冲区拷贝到接收方的接收缓冲区。
结构化数据协议
自定协议 是好用 可实现一样的效果 但是做的都是重复的工作 减轻代码量使用json/protobuf
协议
JSON协议
一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。
cc=g++
all: Calserver Calclient
Calclient:Calclient.cc
$(cc) -o $@ $^ -std=c++11 -ljsoncpp
Calserver:Calserver.cc
$(cc) -o $@ $^ -std=c++11 -ljsoncpp
.PHONY:clean
clean:
rm -rf Calserver Calclient
别忘记带 -ljsoncpp
序列化
Json::Value root;
root["exitcode"] = exitcode;
root["result"] = result;
Json::FastWriter write;
*outString = write.write(root);
反序列化
Json::Value root;
Json::Reader reader;
reader.parse(in,root);
exitcode = root["exitcode"].asInt();;
result = root["result"].asInt();
Protobuf协议
Google开发的协议缓冲区,用于序列化结构化数据,具有高效和跨语言的特性。【其他文章写啦】