线程A里的SOCKET已置为Listen状态。其它线程可以通过某个变量控制线程A里的SOCKET进行ACCEPT或空循环。
(强调:为了父类更通用,我不想在派生类的线程函数的空循环里判断是否阻塞然后退出。)其它线程在关闭线程A时想判断线程A是否处于阻塞(accept)中,但getsockopt(m_hSocket,SOL_SOCKET,SO_ACCEPTCONN,optval,&iSize)得到的(bool)optval[0]的值永远是TRUE,查MSDN得知SO_ACCEPTCONN只是用来判断SOKCET是否已置Listen,不是用来判断是否阻塞的。而select()得到的可读性同样不能判断是否阻塞中。那么我该如何得知SOCKET是否阻塞中?(可以用任何函数)

解决方案 »

  1.   

    //设置非阻塞方式连接
    u_long ul=1;
    if(ioctlsocket(sock,FIONBIO,(u_long*)&ul) == SOCKET_ERROR)
    return Error(_T("Winsock Error!"));
      sockaddr.sin_family=AF_INET; 
        memset(sockaddr.sin_zero,0,8);

    if(0 != connect(sock,(struct sockaddr*)&sockaddr,sizeof(sockaddr)))
    {
    if(WSAGetLastError() != WSAEWOULDBLOCK)
    {
    closesocket(sock);
    return Error(_T("Connect Error!"));
    }
    }
    fd_set rfds;
    struct timeval tv;

    FD_ZERO(&rfds);
    FD_SET(sock,&rfds);
    tv.tv_sec = m_iTimeout;
    tv.tv_usec = 0;
    if(select(0,NULL,&rfds,NULL,&tv) <=0)
    {
    closesocket(sock);
    return Error(_T("Connect TimeOut!"));
    }
    //重新设置为阻塞模式
    ul=0;
    if(ioctlsocket(sock,FIONBIO,(u_long*)&ul) == SOCKET_ERROR)
    return Error(_T("Winsock Error!"));以前我好像问过这个问题,在别人的帮助加解决了,不知对你的有帮助没?