fd_set fdread;
do
{
  FD_ZERO(&fdread);
  FD_SET(CONNSOCKET,&fdread);

  struct timeval tv;
  tv.tv_sec=6;
  tv.tv_usec=0;
  if( (nSelRet = select(0,&fdread,NULL,NULL,&tv)) == SOCKET_ERROR )
  {
    writeTolag("select error!");
            break;
  }
}while(nSelRet == 0);


if( nSelRet > 0 )
{
if( FD_ISSET(CONNSOCKET,&fdread) )
{
  nRet = recv(CONNSOCKET, (char*)cHttpAccept, sizeof(cHttpAccept),0);
                ...}
        }
为什么这样做recv还是会堵塞在那?是我用法不对吗???

解决方案 »

  1.   

    用法不对
    后面这段内容需在do while循环的select之后才对
      

  2.   

    你设置了6秒的等待延时,不会是这个造成的假象吧。 
    建议你这样写:
    tv.tv_sec=0; 
    tv.tv_usec=0;  switch (nSelRet   = select(0,&fdread,NULL,NULL,&tv))   ==   SOCKET_ERROR   ))
            {
                case 0: case -1:
                {
                    break;
                }
                default:
                {
    nRet   =   recv(CONNSOCKET,   (char*)cHttpAccept,   sizeof(cHttpAccept),0); 
    }
      

  3.   

    to leposy:
      while(nSelRet   ==   0); 就是time limit expired
    代码看不出问题,需要代码完全一点.
      

  4.   

    select返回怎么样的信息?
    看看你的socket绑定的情况,有可能问题不是出在select函数这里。
    尽量提供比较多的代码,好分析。