在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:
阻塞IO:socket 的阻塞模式意味着必须要做完IO 操作(包括错误)才会返回。
非阻塞IO:非阻塞模式下无论操作是否完成都会立刻返回,需要通过其他方式来判断具体操作是否成功。(对于connect,accpet操作,通过select判断,对于recv,recvfrom,send,sendto通过返回值+错误码来判断)。
对于一个socket 是阻塞模式还是非阻塞模式的处理方法很简单,可以用fcntl来设置,参数F_GETFL获取flags,F_SETFL设置flags|O_NONBLOCK,同时,recv,send 时使用非阻塞的方式读取和发送消息,即flags设置为MSG_DONTWAIT实现。下面是用fcntl 函数将一个socket 句柄设置(非)阻塞的I/O模式:flags = fcntl(sockfd, F_GETFL, 0); //获取文件的flags值。
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); //设置成非阻塞模式;
flags = fcntl(sockfd,F_GETFL,0);
fcntl(sockfd,F_SETFL,flags&~