socket DataSocket = socket(AF_INET,SOCK_STREAM,0);
WSAAsyncSelect(DataSocket, Window, WM_TCPDATASOCKET,FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);
connect(DataSocket, (const SOCKADDR *)&ServerAddress,sizeof(ServerAddress));以上代码,connect()被执行时,如果连接远程的服务器不在线的话,一般要等10多秒才会返回连接不上远程服务器的错误,我想问有没有什么方法可以令这个超时缩短,例如我想在6秒内连接不上,就返回错误.

解决方案 »

  1.   

    unsigned  long  ul  =  1;  
    int ret  =  ioctlsocket(m_Socket,  FIONBIO,  (unsigned  long*)&ul);  
    if(ret==SOCKET_ERROR)
    {
    int erro = WSAGetLastError();
    TRACE("ioctlsocket erro\n");
    ASSERT(FALSE);
    return FALSE;
    }
    m_bClosing.False(); connect(m_Socket,(struct sockaddr *)&server,sizeof(server));

    struct  timeval  timeout  ;  
    fd_set  r;  

    FD_ZERO(&r);  
    FD_SET(m_Socket,  &r);  
    timeout.tv_sec  =  5;  //连接超时15秒  
    timeout.tv_usec  =0;  
    ret  =  select(0,  0,  &r,  0,  &timeout);  
    if  (  ret  <=  0  )  
    {  
    int ret = WSAGetLastError();
    TRACE("连接失败: %d\n",ret);
    m_bIsConnected = FALSE;
    OnClose();
    return FALSE;
    }  
      

  2.   

    楼上的你弄错了,我不是需要在非阻塞的环境中(像你上面列出的情况),我的程序全是"异步"的,不可能使用select()去等5秒,程序的任何执行都要马上返回结果.你没看到我的socket是用WSAAsyncSelect()进去关联到系统消息了吗?
      

  3.   

    wwwllg(wwwllg) 是对的。
    你不等5秒,谁来知道结果呢?
      

  4.   

    根本没看到我的要求.
    WSAAsyncSelect(DataSocket, Window, WM_TCPDATASOCKET,FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE);
    这句已经将socket设置为异步的了.select()是阻塞的,异步都不存在阻塞的,如果你不明白何为异步,没必要回答这问题.我没说二楼的是错误的,我只是说他的回答,根本就不符合我的要求.他的方法是在非阻塞的socket中设置超时,这个我是会的,但我的程序是异步的.
      

  5.   

    to lz,只能 说明你是个菜鸟。
      

  6.   

    楼上的,如果你认为异步就是非阻塞,是你对基础术语还不清楚.
    异步,英文为Asynchronous;非阻塞,英文为Non-Blocking.或者单单从字眼中很难判断是否一样的东西,请看以下国外一个游戏编程网的一些资料.
    http://www.gamedev.net/reference/programming/features/asyncsock/default.asp看完后再看看谁是菜鸟.
      

  7.   

    to up:
    一般要等10多秒才会返回连接不上远程服务器的错误,我想问有没有什么方法可以令这个超时缩短,例如我想在6秒内连接不上,就返回错误
    -------------
    我上面的代码就可以完成他想要的结果。至于你所说的异步和非阻塞的关系,我并没有表明他们之间的关系。只是你自己认为我那样认为。
    我不喜欢研究文字的一些东西,能达到想要达到的目的就行了。
      

  8.   

    异步 != 非阻塞 ??能解释下有什么不一样吗?调用WSAAsyncSelect的时候就实现了异步(异步是什么意思?难道windows给我们发FD_READ FD_WRITE消息就叫异步???)   然后send recv等函数就以非阻塞模式运行了 感觉没有什么不一样的啊???