第一种方法:fd文件操作符直接设置成非阻塞:
int flag = fcntl(client_fd, F_GETFL);
flag |= O_NONBLOCK;
int ret = fcntl(client_fd, F_SETFL, flag);
if (ret == -1)
{
perror("fcntl:");
}
第二种方法:recv的第四个参数flag设置为MSG_DONTWAIT:
int len_recv = recv( client_fd, recv_buf, sizeof(recv_buf), MSG_DONTWAIT);
if (len_recv == -1)
{
if (errno == EAGAIN || errno == EWOULDBLOCK)
{
continue;
}
perror("read");
exit(-1);
}else if(len_recv > 0){
printf("recv client data : %s\n", recv_buf);
}else if(len_recv == 0){
printf("client closed\n");
break;
}
非阻塞了可能读到的东西就有问题,所以做了错误号的判断。
经过我的实验,两种方式只要设定一个就能让这里的recv变成非阻塞,但是两种方式肯定在别的用处会有所不同,但是在此处,效果一样。
采取其一即可,也就是所谓的一个设置为阻塞一个为非阻塞,最后的结果都是非阻塞。