请教accept()超时如何设置
做了一个服务器段的程序,想将accept()放到while(){}中,循环监听客户端的服务请求,
但是不处理的话,服务器端运行到accept(),如果没有客户端连接的话,就阻塞了,不太好
所以请教大家,accept()的超时是如何设置的。
谢谢!

解决方案 »

  1.   

    什么意思。
    我是想accpet()一个客户端请求,就在服务器端创建一个线程去处理,
    但如果长时间没有连接请求的话,服务器段不就阻塞在accept()这了,
    我是想在长时间没有请求的情况下对服务器做其他处理,比如停掉服务器之类的。
    recv,send不就有超时设置的办法吗,所以请教一下accept()如何设置,
    accept()超时了就方便我下一步做其他的处理。
      

  2.   

    设置成非阻塞的话,那recv和send是否也成了非阻塞模式了呢?
    我之前对recv和send
    用setsockopt()设了超时,
    不好意思,初学者
      

  3.   

    SELECT模型是可以解决你问题,另外求教下,那你不是已经开了一个线程去接收了嘛,你服务器的其他线程不是仍可以工作么不存在你说的问题吧
      

  4.   

    找了一段代码,是否将accept()返回的描述符以参数s 传进去,就可以了呢
    unit32 SocketWait(TSocket* s, bool rd, bool wr, unit32 timems)
     {
     fd_set rfds, wfds;
     #ifdef _WIN32
     TIMEVAL tv;
     #else
     struct timeval tv;
     #endif /*_WIN32*/
     FD_ZERO(&rfds);
     FD_ZERO(&wfds);
     if(rd) //TRUE
     FD_SET(*s, &rfds); //添加要测试的描述字
     if(wr)
     FD_SET(*s, &wfds);
     tv.tv_sec = timems/1000; //seconds
     tv.tv_usec = timems%1000; //ms
     for(;;) //如果errno==EINTR,反复测试缓冲区的可读性
     switch(select((*s)+1, &fds, &wfds, NULL, (timems==TIME_INFINITE?NULL:&tv))) //测试在规定的时间内套接字接口接收缓冲区是否有数据可读
     {
     // 0——超时, -1——出错
     case 0: /*time out*/
     return 0;
     case (-1): /*socket error*/
     if( SocketError()==EINTR )
     break;
     return 0; //有错但不是EINTR
     default:
     if(FD_ISSET(*s, &rfds)) //如果s是fds中的一员返回非0,否则返回0
     return 1;
     if(FD_ISSET(*s, &wfds))
     rerun 2;
     return 0;
     };
     }
      

  5.   

    服务器是开了线程去处理已建立的连接,但主线程还在循环的accept()吗
      

  6.   

    回答你问题:
    select模型是这样的我记得是5个参数
    第一是句柄,最后一个是时间,当中忘记了
    你可以根据select返回的值来判断是否有数据在你的端口上面,如果有数据则RECV如果没有超过时间则返回其他值,你就可以做你想做的事情了。
      

  7.   


    while (cntrFlag)
    { communicateSock = accept(srvSock, (struct sockaddr*)&socketAddr, &len);//listen the application of connecting」ャcreate and return a new Socket,我想在这里做accept超时的处理 if (INVALID_SOCKET == communicateSock)
    {
    printf("Accept error!ERROR:%d\n", WSAGetLastError());
    continue;
    }
    printf("Serve application from %s(at port %d)\n", inet_ntoa(socketAddr.sin_addr),socketAddr.sin_port);
    hThread = CreateThread(NULL,//structure pointer to point SECURITY_ATTRIBUTES
    NULL,//initial thread stack size
    ThreadProc,//the thread entry function,recv,send都在ThreadProc里做 (LPVOID)&communicateSock,//thread parameters passed
    0,//set additional ers used to control the thread
    &dwThreadId);//thread ID
    if (hThread == NULL)
    {
    closesocket(communicateSock);
    printf("ERROR in serving  %s\n", inet_ntoa(socketAddr.sin_addr));
    continue;
    }
    CloseHandle(hThread);
    }
      

  8.   

    while (cntrFlag)
        {        communicateSock = accept(srvSock, (struct sockaddr*)&socketAddr, &len);//listen the application of connecting」ャcreate and return a new Socket
         if (INVALID_SOCKET == communicateSock)    
            {
                printf("Accept error!ERROR:%d\n", WSAGetLastError());
                continue;
            }
            printf("Serve application from %s(at port %d)\n", inet_ntoa(socketAddr.sin_addr),socketAddr.sin_port);
            hThread = CreateThread(NULL,//structure pointer to point SECURITY_ATTRIBUTES
                NULL,//initial thread stack size
                ThreadProc,//the thread entry function
              (LPVOID)&communicateSock,//thread parameters passed
                0,//set additional ers used to control the thread
                &dwThreadId);//thread ID    
            if (hThread == NULL)
            {
                closesocket(communicateSock);
                printf("ERROR in serving  %s\n", inet_ntoa(socketAddr.sin_addr));
                continue;
            }
            CloseHandle(hThread);
        }我想在这里做accept()后,如果长时间没有连接请求时,做超时的处理
    recv,send都放在了ThreadProc里创建线程去做了
      

  9.   

    http://blog.csdn.net/antghazi/archive/2001/12/17/5407.aspx这个应该是你想要的~