https://blog.csdn.net/hguisu/article/details/7445768
另:
read与recv区别
https://www.sidney.wiki/wangluobiancheng/1239
select、poll、epoll的区别和实现
https://www.sidney.wiki/wangluobiancheng/1225
阻塞和非阻塞IO:
https://www.sidney.wiki/network/1103
socket的函数默认是阻塞IO的,对于非阻塞IO需要这样设置:
非阻塞IO的设置:
sock = socket(PF_INET, SOCK_STREAM, 0);
int flags = fcntl(sock, F_GETFL, 0);
fcntl(sock, F_SETFL, flags | O_NONBLOCK);
当设置了非阻塞io后,accept和read将不会阻塞。
进程发起IO系统调用后,如果内核缓冲区没有数据,进程返回一个错误而不会被阻塞;
进程发起IO系统调用后,如果内核缓冲区有数据,内核就会把数据返回进程。
accept():
在non-blocking模式下,如果返回值为-1,且errno == EAGAIN或errno == EWOULDBLOCK表示no connections没有新连接请求;
recv()/recvfrom():
在non-blocking模式下,如果返回值为-1,且errno == EAGAIN表示没有可接受的数据或很在接受尚未完成;
send()/sendto():
在non-blocking模式下,如果返回值为-1,且errno == EAGAIN或errno == EWOULDBLOCK表示没有可发送数据或数据发送正在进行没有完成。
read/write:
在non-blocking模式下,如果返回-1,且errno == EAGAIN表示没有可读写数据或可读写正在进行尚未完成。
connect():
在non-bloking模式下,如果返回-1,且errno = EINPROGRESS表示正在连接。