如题

解决方案 »

  1.   

    FD_SET ReadSet;
    unsigned long rlen;
    //中间的代码省略
     while (true)
      {
        FD_ZERO(&ReadSet);
        FD_SET(sClient,&ReadSet);
    if (select(0,&ReadSet,NULL,NULL,NULL)==SOCKET_ERROR)//阻塞在select调用,当有数据到来时select返回
          return WSAGetLastError();
    if (FD_ISSET(sClient,&ReadSet))
    {
          if (ioctlsocket(sClient,FIONREAD,&rlen))//判断接收缓冲区有多少字节数据
            return WSAGetLastError();
          rlen=MIN(rlen,sizeof(buf));
          memset(buf,0,sizeof(buf));
          if (recv(sClient,buf,rlen,0)<1)
            return WSAGetLastError();
      break;
        }  
      }
    此处是tcp,udp是一样,只不过tcp中ioctlsocket返回的接收缓冲区所有数据,udp中ioctlsocket返回套接口上排队的第一个数据报大小。
      

  2.   

    这种想法,偶觉得不合理。每来一个包,你都要动态分配一个缓存区,这样频繁地分配,释放内存,会降低性能
    不如分配一个大点的数组...比如1024,2048,4096...反正提交物理内存块时一般是4k,就算你只用1BYTE也会这样...
      

  3.   

    感谢DaYuTou(稀饭) 。
    我在找如何知道tcp缓冲区内有多少字节可以接收数据。
    现在明白了。
    再次感谢。