linux下非阻塞模式网络通讯模型示例分享

2019-09-30 18:53:16刘景俊

        {
            DEBUG_OUTPUT( "Create socket is failed" );

            iResult = -2;
            break;
        }

        // 3.为了调用 connect 函数不阻塞,设置连接服务端的套接字为非阻塞模式
        iValue = 1; //
        iResult = ioctl( iServerSocket, // 服务端收发套接字
                         FIONBIO,       // 设置或清除非阻塞I/O标志
                         &iValue );     // 零(0) - 清除,非零(0) - 设置
        if ( 0 > iResult )
        {
            DEBUG_OUTPUT_PARA( "Call ioctl to set I/O asynchronization is failed, return %d",
                               iResult );

            iResult = -3;
            break;
        }

        sServerAddr.sin_family = AF_INET;
        inet_pton( AF_INET,
                   m_caServerIP,
                   &sServerAddr.sin_addr );
        sServerAddr.sin_port = htons( m_usServerPort );

        // 4.连接服务端
        iResult = connect( iServerSocket,
                           (sockaddr*)&sServerAddr,
                           sizeof( sServerAddr ) );
        // 调用 connect 函数,正常情况下,因为 TCP 三次握手需要一些时间,
        // 而非阻塞调用只要不能立即完成就会返回错误,所以这里会返回 EINPROGRESS ,