day02-多进程多线程

掌握三次握手建立连接过程
掌握四次握手关闭连接的过程
掌握滑动窗口的概念
掌握错误处理函数封装
实现多进程并发服务器
实现多线程并发服务器

函数封装的思想-处理异常情况
结合man-page和errno进行封装.
在封装的时候起名可以把第一个函数名的字母大写,如 socket可以封装成Socket,这样可以按shif+K进行搜索, shift+k搜索函数说明的时候不区分大小写,使用man page也可以查看, man page对大小写不区分.

真正的程序,是看不到socket,bind,listen这种函数,一般都集成好了,一个函数能实现好几个功能

像accept,read这样的能够引起阻塞的函数,若被信号打断,由于信号的优先级较高,会优先处理信号,信号处理完成后,会使accept或者read 解除阻塞,然后返回,此时返回值为-1,设置 errno=EINTR;
errno=ECONNABORTED表示连接被打断,异常.

errno宏:
在/usr/include/asm-generic/errno.h 文件中包含了errno所有的宏和对应的错误描述信息.

通过man errno查看

高并发服务器

如何支持多个客户端—支持多并发的服务器
由于accept 和read函数都会阻塞,如当read的时候,不能调用accept接受新的连接,当accept阻塞等待的时候不能read读数据.
第一种方案:使用多进程,可以让父进程接受新连接,让子进程处理与客户端通信
思路:让父进程accept接受新连接,然后fork子进程,让子进程处理通信,子进程处理完成后退出,父进程使用SIGCHLD信号回收子进程.

代码实现:
第二种方案:使用多线程,让主线程接受新连接,让子线程处理与客户端通信;使用多线程要将线程设置为分离属性,让线程在退出之后自己回收资源.