?

解决方案 »

  1.   

    if( (s=socket(AF_INET, SOCK_STREAM, 0))<0){ 
    return FALSE; 

    fcntl(s,F_SETFL, O_NONBLOCK); if(connect(s,(struct sockaddr*)&saddr, sizeof(saddr)) == -1) { 
    if (errno == EINPROGRESS){// it is in the connect process 
    struct timeval tv; 
    fd_set writefds; 
    tv.tv_sec = m_nTimeOut; 
    tv.tv_usec = 0; 
    FD_ZERO(&writefds); 
    FD_SET(s, &writefds); 
    if(select(s+1,NULL,&writefds,NULL,&tv)>0){ 
    int len=sizeof(int); 
    //下面的一句一定要,主要针对防火墙 
    getsockopt(s, SOL_SOCKET, SO_ERROR, &error, &len); 
    if(error==0) ret=TRUE; 
    else ret=FALSE; 
    }else ret=FALSE;//timeout or error happen 
    }else ret=FALSE; 

    else ret=TRUE; close(s); 
      

  2.   

    请分清楚异步IO和非阻塞IO的区别。异步IO是吧IO提交给系统去做,做完了通知你。
    非阻塞IO是通过某种方法定时向系统查询是否可以做了,当可以做了系统就
    告诉你,然后你再去做。