本帖最后由 VisualEleven 于 2011-07-14 11:58:27 编辑

解决方案 »

  1.   

    ReceiveString和ReceiveString2是两种接收的方式,不管用哪个来接收数据都是一样的结果
      

  2.   

    ioctlsocket之前使用
    ::setsockopt(m_socket,SOL_SOCKET,SO_REUSEADDR,(char *)&nReUse,sizeof(int));
      

  3.   

    select成功一次  FD_ISSET测试一次. 可读. recv一次。 再去select... 
      

  4.   

    WSAWaitForMultipleEvents的超时时间单位是毫秒,你确定是只想等100ms吗?如果使用WSAEnumNetworkEvents,就不要用ioctlsocket了,只要有FD_READ事件,就调用WSARecv接收,能收多少就收多少,如果没有收完,Winsock系统会再次触发FD_READ事件,异步方式应该是这样处理的
      

  5.   

    ReceiveString2函数中select模型写的看着挺别扭的
    fd_set fdSocket;
    FD_ZERO(&fdSocket);
    FD_SET(sListen, &fdSocket);
    while(TRUE)
    {
     fd_set fdRead = fdSocket;
     int nRet = select(0, &fdRead, NULL, NULL, &tv);
     if(nRet)
     {
       for(int i=0; i<(int)fdSocket.fd_count; i++)
       {
         if(FD_ISSET(fdSocket.fd_array[i], &fdRead))
         {
            if(sListen == fdSocket.fd_array[i]) 
            {
              ...
            }
            else
            {
               char szText[256] = {0};
               int nRecv = recv(fdSocket.fd_array[i], szText, 256, 0);
               if(nRecv)
               {
                  // recv data
               }
               else
               { 
                  closesocket(fdSocket.fd_array[i]);
                  FD_CLR(fdSocket_fd_array[i], &fdSocked);
               }
            }
         }
       }
     }
    }
      

  6.   

    问题是select的时候就阻塞住了,到不了ioctlsocket来
      

  7.   

    如果输入nTimeout<=0,代表没有数据来就一直阻塞,这时候才会赋值每次超时时间100ms,实际上每次调用这个函数的时候都会有一个大于0的nTimeout进来,本机测试一般是1000,也就是1秒,服务器测试一般会用10000,也就是10秒。
    用ioctlsocket是为了一次性把所有数据读完,请问用了会出问题吗?
      

  8.   


    一般不会有问题,WSAxxx系列使用Event和重叠IO异步机制,不需要每次判断缓冲区数据大小,对于连续的通信过程来说,也是不准确的,比如刚调用完ioctlsocket,底层buffer又收到了一批数据这种情况。
      

  9.   

    谢谢各位,问题已经找到了,是被测系统的问题...被测系统用的HTTP协议包有bug,所有回帖的朋友都有分哟~~