read是将内核空间读缓冲区的内容读到用户空间;write是将用户空间的内容写到内核空间的写缓冲区
剩下的操作比如将缓冲区的内容发送到对端是由协议栈完成,协议栈还完成校验和的计算和判断
1、消息的到达
read 、recv:如果读缓冲区没数据
非阻塞IO read=-1 且 errno=EWOULDBLOCK
阻塞IO read阻塞直到IO有数据
2、消息发送完毕
write、send 只是将数据写到写缓冲区,
假如缓冲区满了
非阻塞IO write=-1 且errno=EWOULDBLOCK
阻塞IO write阻塞直到缓冲区有足够的空间
3、三个问题
阻塞在哪:网络线程
怎么决定是否阻塞:创建套接字的时候会传入参数是否阻塞,调用函数的时候传入的套接字会决定;默认阻塞
怎么判断是否阻塞:IO当数据未到达的时候是否马上返回
4、扩展
服务器关闭连接:
主动关闭:close() shutdown(fd)
被动关闭:read=0 或 (write=-1 && errno =epipe)