C++设置套接字为非阻塞套接字实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 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来实现的。

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/89428277