• 非阻塞connect


    int connect_nonb(int sockfd, const SA *saptr, socklen_t salen, int nsec)
    {
        int              flags, n, error;
        socklen_t        len;
        fd_set           rset, wset;
        struct timeval   tval;
    
        flags = fcntl(sockfd, F_GETFL, 0);
        fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
    
        error = 0;
        if ( (n = connect(sockfd, saptr, salen)) < 0)
            if (errno != EINPROGRESS)
                return(-1);
    
        /* Do whatever we want while the connect is taking place. */
    
        if (n == 0)
            goto done;    /* connect completed immediately */
    
        FD_ZERO(&rset);
        FD_SET(sockfd, &rset);
        wset = rset;
        tval.tv_sec = nsec;
        tval.tv_usec = 0;
    
        if ( (n = select(sockfd+1, &rset, &wset, NULL,
                         nsec ? &tval : NULL)) == 0) {
            close(sockfd);        /* timeout */
            errno = ETIMEDOUT;
            return(-1);
        }
    
        if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) {
            len = sizeof(error);
            if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
                return(-1);            /* Solaris pending error */
        } else
            err_quit("select error: sockfd not set");
    
        done:
        fcntl(sockfd, F_SETFL, flags); /* restore file status flags */
    
        if (error) {
            close(sockfd);             /* just in case */
            errno = error;
            return(-1);
        }
        return(0);
    }
  • 相关阅读:
    HTML 相关面试题
    h5简写时钟效果
    软件工程结对作业二
    软件工程结对作业一
    软件工程第三次作业
    软件工程第二次作业
    软件工程第一次作业
    软件工程第四次作业
    软件工程第三次作业
    2019软件工程第二次作业(VS2017中对C++的单元测试)
  • 原文地址:https://www.cnblogs.com/soldierback/p/10776846.html
Copyright © 2020-2023  润新知