Exemplo n.º 1
0
static int connect_nonb(int sockfd, const struct sockaddr *addr, socklen_t addrlen, int msec)
{
    int flags, n, error;
    socklen_t len;
    fd_set rset, wset;
    struct timeval tval;

    flags = setnonblock(sockfd);

    error = 0;
    if ((n = connect(sockfd, addr, addrlen)) < 0) {
#if (!(defined(WIN32) || defined(_WIN32)))
        if (errno != EINPROGRESS)
            return -1;
#endif
    }
    fprintf(stderr, "connect end\n");

    if (n == 0)
        goto done;               /* connect completed immediately */

    FD_ZERO(&rset);
    FD_SET(sockfd, &rset);
    wset = rset;
    tval.tv_sec = msec / 1000;
    tval.tv_usec = msec % 1000;

    fprintf(stderr, "start select\n");
    if ( (n = select(sockfd + 1, &rset, &wset, NULL,
                     msec ? &tval : NULL)) == 0) {
#if (!(defined(WIN32) || defined(_WIN32)))
        errno = ETIMEDOUT;
#endif
        return -1;
    }
    fprintf(stderr, "end select\n");

    if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) {
        len = sizeof(error);
        if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
            /* Solaris pending error */
            return -1;
    } else {
        fprintf(stderr, "select error: sockfd not set");
        return -1;
    }

done:
    /* restore file status flags */
    restoreflags(sockfd, flags);

    if (error) {
#if (!(defined(WIN32) || defined(_WIN32)))
        errno = error;
#endif
        return -1;
    }
    return 0;
}
Exemplo n.º 2
0
void dex32_restoreints(DWORD flags)
 {
   restoreflags(flags);
 ;};