发送一个命令到服务器端,服务器返回数据,但是返回过来的数据长度不定,这个时候应该如何对recv做处理,要采用阻塞还是非阻塞模式?

解决方案 »

  1.   

    循环接收,每次接收一个固定的长度,一直到接收完为止
    while(接受数据)
    {
    }
      

  2.   

    同意楼上!你可以循环接收,固定循环接收的长度,
    while
    {
      rev(s,(char*)(固定),sizeof(固定),0)
    }
    最后判定是否还有数据发来
      

  3.   

    你说的类似http断点续传,给socket 一个超时值,你成功连上主机后,就用一个缓冲区,循环接收,如果超时了就是没有了
      

  4.   

    回 ppzine(修练形意拳):
    你说的这种就是用异步吧?
    超时了就是没有了?但是这样能够保证数据全部都收下来吗?如果还有数据,但是接收过程中超时时间内没有收到数据,应该也是超时吧?但是这种情况下好象不能当作是没有数据呀?回 shusong1228(mugong):
    你说的这两个方法倒是比较常用的,给数据包加包尾的话有的时候比较难判断,因为在接收大量数据时有可能中间也碰到和包尾一样的数据吧?
      

  5.   

    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返回套接口上排队的第一个数据报大小。
      

  6.   

    我这几天学习SOCKET I/O模式,我想你应该用到这个吧里面就是处理SOCKET 套接字请求。有5种,你说的好象用SELECT模型可以解决。因为SELECT是选择有请求的套接字,对他进行处理。您不防试一下。可惜我学了5天了。也是学会一点皮毛。