序列化,应用层自定义协议
我们发的是一个结构化的数据
OS内部,协议全部都是传递结构体对象。可以直接发送二进制对象吗?因为CS双方都能认识这个结构体!!!
可以直接发送二进制对象,但是不建议
1. 客户端和服务器说属于不同的OS,不同的结构体,在不同的对齐方案下,我们的结构体大小可能不一样。存在内存对其问题,可能导致无法正确解析
2. 客户端和服务器的语言可能不同
从今天开始,我们要进行网络协议的通信,在应用层,强烈建议使用序列化和反序列化方案,至于直接传递结构体的方案,除非特殊场景,否则不建议
write本质是拷贝,
1. write,read就是收发消息 -- write,和read是不是把数据发送到了网络中? 不是,本质上把数据由用户拷贝到Os内核里,os决定什么时候发,OS把数据发送到网络中,本质也是拷贝
2. 主机间通信的本质:把发送方的发送缓冲区内部的数据,拷贝到对端的接受缓冲区
3. TCP通道是全双工的?因为有两对发送和接受缓冲区,接受和发送是分离的
读数据其实是检测接受缓冲区里有没有数据,没有数据read就会阻塞,read也是拷贝,从内核拷贝到用户
文件描述符对应的tcp发送缓冲区,tcp自主决定什么时候发,发多少,出错了呢?传输控制协议
四组生产者消费模型(内核和用户之间),阻塞?因为和系统做同步
计算机世界:通信即拷贝
tcp:面向字节流,什么时候发?发多少?出错?
在tcp中,要读到完整的报文,由接收方应用层自己决定的
我们未来定制的协议:
1.结构化字段,提供好序列化和反序列化方案
2.解决因为字节流问题导致读取不完整的问题(只处理读取)
Jsoncpp是一个用于处理TSON数据的C++库,他提供了将JSON数据序列化为字符串以及从字符串反序列化为C++数据的功能,Jsoncpp是开源的,广泛用于各种需要处理JSON数据的C++项目
因为tcp是面向字节流的。当读取方在读取的时候,可能读到一个完整的json请求,也可能会读到半个、一个、五个、五个半请求json串。都会有可能存在
read本身并不能保证读到的报文的完整性,只能保证如果有数据就读上来。谁来保证报文的完整性?应用层程序员自己保证。就需要进一步定制协议。
当我们tcp中读取数据的时候,读到的报文不完整,或者多读导致下一个报文不完整,这个问题就叫做“粘报”问题