带连接超时的Connect

作者在 2010-09-13 22:32:49 发布以下内容

int ConnectWithTimeout (SOCKET sock,struct sockaddr *addr,int addrlen,struct timeval *timeout)
{
    int nRet = 0;
    unsigned long nonblocking = 1;
    unsigned long blocking = 0;
    if(!timeout)
        return connect(sock, addr, addrlen);
    ioctlsocket(sock, FIONBIO, &nonblocking);
    if(connect(sock, addr, addrlen) == SOCKET_ERROR)
    {
        fd_set writefds;
        FD_ZERO(&writefds);
        FD_SET(sock, &writefds);
        if(select(0, NULL, &writefds, NULL, timeout) != 0)
        {
            if(FD_ISSET(sock, &writefds))
            {
                nRet = 0;
            }
            else
            {
                nRet = WSAETIMEDOUT;
            }
        }
        else
        {
            nRet = WSAETIMEDOUT;
        }
    }
    ioctlsocket(sock, FIONBIO, &blocking);
    return nRet;
}
默认分类 | 阅读 1016 次
文章评论,共0条
游客请输入验证码
浏览52312次
文章分类
最新评论