(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~https://blog.csdn.net/ky233?type=blog
点个关注不迷路⌯'▾'⌯
目录
1.协议
1.序列化与反序列换
2.协议定制
二、网络版本的计算器
1.约定与协议
2.守护进程
3.代码
1.协议
协议是一种 "约定". socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如果我们要传输一些 "结构化的数据" 怎么办呢?
1.序列化与反序列换
发送数据时将这个结构体按照一个规则转换成字符串, 接收到数据的时候再按照相同的规则把字符串转 化回结构体;
这个过程叫做 "序列化" 和 "反序列化"
2.协议定制
所谓的协议定制是来定义请求以及未来响应的字段都需要哪些,字段本身就是协议的一部分,还有很多细节在代码中体现出来
二、网络版本的计算器
1.约定与协议
约定:就比如是我们规定好的计算顺序,如果顺序不对则无法进行计算
协议:
- 我们结构化的约定就叫做协议
- 我们需要把这些数据发给服务器或者客户端,就需要把这些数据转换成字节流,对方基于收到的字节流,对其做反序列化,无论是发送或接受都需要进行序列和反序列化!
因为TCP是面向字节流的(TCP有可能一个一个读也有可能一次全部读完),那么我们读取的时候怎么保证是一个完整的请求呢?
当我们调用send或者write的时候只是把我们的数据拷贝到了发送缓冲区,在调recv或者read的时候之后只是把接受缓冲区拷贝到用户定义的缓冲区
所以:
- io接口:本质都是拷贝函数
- 发送的次数和接受的次数,没有任何关系,叫做面向字节流!
单纯的recv是无法解决这个问题的,所以需要更进一步的协议定制
UDP是面向数据报的,每次都是完整的报文,则不会有上述问题
2.守护进程
1.前台进程:和终端关联的进程,判断标准为,该进程能否获取输入,如bash
2.任何xshell登录,只允许一个前台进程和多个后台进程
3.进程除了有自己的pid和ppid,还有组id TPGID
4.在命令行中,同时用管道启动多个进程,多个进程是兄弟关系,父进程是bash,可以用匿名来进行管道通信
5.而同时被创建的多个进程可以成为一个进程组的概念,组长一般是第一个进程PGID
6.SID:任何一次登录,登陆的用户,需要有多个进程(组),来给这个用户提供服务的(bash),用户自己可以启动很多进程,或者进程组。我们给用户提供服务的进程,或者用户自己启动的所有的进程或者服务,整体都是属于一个叫做会话的机制中的
退出登陆的时候,启动的服务就有可能退出,但是我们需要一种服务不退出的机制就叫做守护进程,所以我们就需要把这个进程自成一个会话,
7.如何将自己变成自成会话呢?
调用setsid()函数 ,就把这个进程变成单独的会话组了
8.setsid要成功被调用,必须保证当前进程不是进程组的组长
那么怎么保证不是组长呢?可以通过fock(),变成子进程
9.守护进程不能向显示打印消息,一旦打印会被暂停
devnull相当于linux的文件黑洞,任何到里面的东西自动销毁