Linux socket编程(一)之fcntl()非堵塞
一.背景
我们都知道一台服务器会与许多主机建立连接,但是之前的connect(),recv(),send()等都是堵塞函数。举个例子,服务器端的accept()用于接受请求建立连接,当发生accept()调用时,服务器端的程序就会一直等着某个客户端向它发送建立连接的请求,也就是发生了堵塞。我们可以把代表这个服务器程序的socket套接字描述符(sockfd)通过fcntl()设置为非堵塞方式,即当没有客户端请求建立连接时,就直接返回。
二.fcntl()使用:
1.获取文件的flags:
flags=fcntl(fd,F_GETFL,0);
2.给flags增添非堵塞属性:
flags|=O_NONBLOCK;//多个参数用|连接
3.设置文件的flags:
fcntl(fd,F_SETFL,flags);
取消文件的非堵塞属性如下:
flags=fcntl(fd,F_GETFL,0);
flags&=~NONBLOCK;
fcntl(fd,F_SETFL,flags);
三.实例代码如下:
我们都知道一台服务器会与许多主机建立连接,但是之前的connect(),recv(),send()等都是堵塞函数。举个例子,服务器端的accept()用于接受请求建立连接,当发生accept()调用时,服务器端的程序就会一直等着某个客户端向它发送建立连接的请求,也就是发生了堵塞。我们可以把代表这个服务器程序的socket套接字描述符(sockfd)通过fcntl()设置为非堵塞方式,即当没有客户端请求建立连接时,就直接返回。
二.fcntl()使用:
1.获取文件的flags:
flags=fcntl(fd,F_GETFL,0);
2.给flags增添非堵塞属性:
flags|=O_NONBLOCK;//多个参数用|连接
3.设置文件的flags:
fcntl(fd,F_SETFL,flags);
取消文件的非堵塞属性如下:
flags=fcntl(fd,F_GETFL,0);
flags&=~NONBLOCK;
fcntl(fd,F_SETFL,flags);
三.实例代码如下:
<