本帖最后由 oyljerry 于 2012-04-06 11:04:14 编辑

解决方案 »

  1.   

    可能上面没说清楚,如果关闭服务端程序,或者禁用网络,那么select不会阻塞,每次都返回1;recv则每次返回-1,接收失败;
    这个while()会无限制的循环下去。

      

  2.   

    是否有数据读不是这样判断的i = select(s + 1, &fds, NULL, NULL, &nextEvent);
    if (i > 0 && FD_ISSET(s, &fds))
      

  3.   

    select模型中,当
    ■ 有数据可以读入。
    ■ 连接已经关闭、重设或中止。
    都符合可读性条件
      

  4.   

    recv -1返回值意思就是说明连接异常断开
      

  5.   

    获取错误代码,判断是不是peer关闭连接。
      

  6.   

    试试recv前检查一下socket是否有效。
      

  7.   

    很正确啊
    你关闭服务器端
    那么SOCKET被关闭
    SELECT当然返回SOCKET就绪,1表示1个SOCKET就绪
    只不过实际是连接中断
    你调用RECV,返回-1就是SOCKET——ERROR
    这个时候用WSAGetlastError函数判断具体错误,就可以发现是连接关闭每个函数都要检查返回值
    如果SELECT返回0,也要处理,这一般表示SOCKET没有设置或者你的网络挂了