以下都以不要轮询为前题,并且,使用标准的socket函数,如果能回答,请麻烦给我一段示例的代码,或者有代码的地址。万分感谢!!!
1. 创建一个socket,在等待连接上来时,如何设置等待超时??2. connect对方时,如果连不上,马上就返回,不要等那么久的时间??

解决方案 »

  1.   

    setsockopt()中有关于超时的选项,具体可查看MSDN
    至于例子,MS版的<windows网络编程>上有PING.EXE的原代码,仔细看看
      

  2.   

    SOCKET   SockArray[2];
    WSAEVENT EventArray[2];
    WSAEVENT NewEvent;
    WSANETWORKEVENTS    NetworkEvents;NewEvent = WSACreateEvent();
    WSAEventSelect(SockConnect, NewEvent, FD_CONNECT);
    SockArray[0]  = SockConnect;
    EventArray[0] = NewEvent;
    DWORD EventTotal = 1;
    nIndex =WSAWaitForMultipleEvents( EventTotal,
                                      EventArray,
                                      FALSE,
                                      WSA_INFINITE,/*将WSA_INFINITE 改为你想等待的时间*/
                                      FALSE );
    WSAEnumNetworkEvents( SocketArray[nIndex - WSA_WAIT_EVENT_0],
        EventArray[nIndex - WSA_WAIT_EVENT_0],
        &NetworkEvents );
    if ( NetworkEvents.lNetworkEvents & FD_CONNECT )
    {
        if ( NetworkEvents.iErrorCode[FD_ACCEPT_BIT] != 0 )
       {
            //**********ERROR***********
            RETURN ;
        }
      
        //*************DO WHAT YOU WANT***************}
      

  3.   

    SOCKET cClient;TimeOut=6000;//设置接收超时6秒
    if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
    {
    return 0;
    }
    int TimeOut=6000; //设置发送超时6秒
    if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
    {
    return 0;
    }
      

  4.   

    如果我不想用winsock2的那些函数的话,有没有什么好的办法??
    如果不行,我有一个想法,我能不能在主线程里创建一个socket,然后作为参数传给由主线程建立的一个子线程去accept,然后主线程WaitForSingleObject阻塞在那里,如果超时返回,那么认为子线程的socket没有被连接,那么close子线程的socket,让子线程自动死掉,然后主线程返回超时没有被连接的错误。如果没有超时,就使用被子线程accept进来的socket虽然这样比较笨,但希望有人能告诉我不用winsock2那些函数能使用的方式。。谢谢了。
      

  5.   

    呵呵,如果有第二个客户连接的话怎么办?
    用mfc就很容易
    它有自己的触发机制,用客户连接就会调用OnAccept()函数
    在该函数里accept你的客户端
      

  6.   

    但我是想在被连接端建立socket,listen之后,accept时,如果发生比如10秒内没有人连上来,我就要关掉此socket,connect的问题倒是其次的。有没有更多的建议???谢谢
      

  7.   

    把accept放在线程里, 如果10秒到了则通知线程结束,否则循环等待.
      

  8.   

    试试nanjianhui(nan)的方法. 
    accept也许是SO_RCVTIMEO超时,connect是SO_SNDTIMEO超时.
      

  9.   

    同步模式下,使用SOCKET  API编程时的网络连接超时设置程序:  
    connect超时  
    send超时  
    recv超时  
     
    --------------------------------------------------------------  
     
    int  iValue,  iLen=sizeof(iValue);  
    iValue  =  ???;//超时值  
    setsockopt(m_sSock,  SOL_SOCKET,  SO_RCVTIMEO,  (char  *)(&iValue),  iLen);  //接收超时  
     
    setsockopt(m_sSock,  SOL_SOCKET,  SO_SNDTIMEO,  (char  *)(&iValue),  iLen);//发送超时  
    ---------------------------------------------------------------  
     
    除了通过用setsockopt设置socket选项,也可以用线程的方法,比如:  
    //  负责连接的线程,参数为socket  
    void  connnectthread(socket  s)  
    {  
    connect(s);  
    }  
     
    main()  
    {  
       //启动连接线程  
       h_thread  =  beginthread(connectthread);  
     
       //  可以根据返回值来判断是连接完成,还是超过指定的timeout  
       waitforsingleobject(h_thread,  timeout);  
       
    }  
    ---------------------------------------------------------------  
     
    设置目的地址不存在时的SOCKET  connect  超时,请看下面的连接.  
    http://www.codeguru.com/internet/timeoutsocket.shtml