非阻塞sock
sock的4个常用函数默认都是阻塞的。
connect accpet() send() recv()
想要使用非阻塞的需要将sock 更改
设置为非阻塞的SOCK
可以用函数
int setnonblocking(int fd)
{int flags=fcntl(fd,F_GETFL,0)//获取fd的状态if(flags==-1){flags=0;}return fcntl(fd,F_SETFL,flags|O_NONBLOCK);
}
也可以一行解决
fcntl(sock,F_SETFL,fcntl(sock,F_GETFD,0)|O_NONBLOCK;
首先第一个fcntl() 获取文件状态标志,如果获取失败,返回-1
第二个fcntl() 通过位或操作为文件增加O_NONBLOCK 状态
accept()函数的改变
当sock设置为非阻塞后acccpt无论是否有连接都会直接返回错误
这时候需要查看报错信息errno
当errno为EAGAIN时并没有发生真正的错误,为其它时才发生了错误
此时只有唯一一种方法才能证明连接成功建立,当可以写时
if (accept(listensock,0,0)==-1){if (errno!=EAGAIN){perror("accept:");return -1;}}
recv()函数的改变
变化与accept()函数很像
会直接返回错误
当errno为EINPROGRESS时并没有发生错误
if(connect(sockfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr))==-1){if(errno!=EINPROGRESS){close(sockfd);return -1;}}