版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/89428277
一 点睛
把套接字设为非阻塞模式后,很多Linsock函数会立即返回,但并不意味着操作已经结束。
二 设置套接字为非阻塞套接字
1 代码
#include <sys/socket.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/time.h>
int setnonblocking( int fd ) //自定义函数,用于设置套接字为非阻塞套接字
{
int old_option = fcntl( fd, F_GETFL );
int new_option = old_option | O_NONBLOCK;
fcntl( fd, F_SETFL, new_option ); //设置为非阻塞套接字
return old_option;
}
int main( int argc, char* argv[] )
{
int sock = socket( PF_INET, SOCK_STREAM, 0 );
assert( sock >= 0 );
int old_option = fcntl( sock, F_GETFL );
if(0==(old_option & O_NONBLOCK))
printf("now socket is BLOCK mode\n"); //0 is block mode
else
printf("now socket is NOT BLOCK mode\n");
setnonblocking(sock);
old_option = fcntl( sock, F_GETFL );
if(0==(old_option & O_NONBLOCK))
printf("now socket is BLOCK mode\n"); //0 is block mode
else
printf("now socket is NOBLOCK mode\n");
return 0;
}
2 运行
[root@localhost test]# g++ test.cpp -o test
[root@localhost test]# ./test
now socket is BLOCK mode
now socket is NOBLOCK mode
3 说明
可以看到,在调用了setnonblocking函数后,套接字变为了非阻塞套接字。实际功能也是通过系统调用fcntl来实现的。