I/O复用
I/O复用的场合:
1 客户处理多个描述字时
2 客户处理多个套接口
3 服务器处理监听套接口,又要处理已连接套接口
4 既处理TCP,又处理UDP
5 处理多个服务或者多个协议
套接口上的输入操作:
1 数据到达网络,分组到达时,被拷贝到内核的某个缓冲区
2 将数据从内核缓冲区拷贝到应用缓冲区
非阻塞模型,应用进程连续不断的查询内核,看看某操作是否准备好。这对CPU时间是极大的浪费。
I/O复用,调用select或pool,调用某一个阻塞
通过系统调用sigaction安装信号处理程序,当数据准备好时,就生成一个SIGIO信号,调用recvfrom读取数据报
异步IO模型:
调用函数aio_read传递给内核相关信息,内核数据拷贝完成后,返回信号
select()函数:
允许进程指示内核等待多个事件中的任一个发生,并仅在一个或多个时间发生或经过某指定的事件后才唤醒进程。
套接口准备读:
1 接收缓冲区中的数据字节数大于等于套接口接收缓冲区低潮限度的当前值
2 连接的读这一半关闭
3 套接口是一个监听套接口且已完成的连接数为非0
4 有一个套接口错误待处理
套接口准备写:
1 发送缓冲区中的可用字节数大于等于套接口发送缓冲区低潮限度的当前值,且或 套接口已连接,套接口不要求连接
2 连接的写这一半关闭
3 有一个套接口错误待处理
接收和发送低潮限度的目的:
在select返回之前,应用进程知道有多少出具可读或有多大的空间可用于写
使用shutdown相对于cloose的好处:
1 close将描述字的计数减1,在此计数为0时才关闭套接口。用shutdown激发TCP正常连接终止序列,不管访问计数
2 close终止了数据传送两个方向:读和写。
使用shutdown半关闭连接:
int shutdown(int sockfd,int howto);
howto类型:
1 SHUT_RD 关闭连接读的这一半,不再接受数据,现有的都作废。
2 SHUT_WR 关闭连接的写的这一半,当前缓冲区的数据都被发送,后跟正常的TCP终止序列。
3 SHUT_RDWR 连接的读这一半,和写这一半都关闭。相当于两次shutdown
拒绝服务型攻击:
当一个服务器整处理多个客户时,服务器不能阻塞于单个客户相关的函数调用。如果这样,服务器将悬挂并拒绝为所有其他的客户提供服务。