请问在发送方发过来的数据长度大于,我缓冲区一次能读取的数据量,是不是可以循环读取?
  SOCKET socket;
  char buffer[200];
  int len=200;
  .............
  while(true)
{
  while(recv(sokcet,buffer,len,0)!=0)
 {
 
  }
  break;
}

解决方案 »

  1.   

    当然可以
    recv后面的参数可以设置接受的数据大小
      

  2.   

    从微软的标准解答上看,这是不可以的。你只能读取发来的数据中的前面一段(长度为你的接收缓冲那么大),之后,如果你是非可靠连接(如udp),则recv返回错误信息;如果是可靠连接,发来的数据将被保留,直到你有一个足够大的接收缓冲来读取它。
      

  3.   

    recv()函数返回的是我实际读取的字符的长度吗?
      

  4.   

    to:ww51xh(黑心狼) 
    你可以建立一个应用协议。建立报头,每次把数据加上报头发出去,接受端在进行解析,根据报头知道该次数据有多大?然后,根据数据包的文件片断序号将文件组合。
    struct header
    {
        int  nSize;//该次发送数据大小
        int  nFileSectionID//文件分割序号
    }接收数据可以这样:
    int nBytesSize = 0; // 数据报头保存该次数据发送尺寸
    int dwBytes = 0;
    int nBytesRecv = 0;

     
    if( (dwBytes = Receive( &nBytesSize, sizeof(int) )) == SOCKET_ERROR ) {
    Clear();
    return;
    } char* pData = new char[nBytesSize];
    if( pData == NULL ) {
    Clear();
    return;
    }
    memcpy( pData, &nBytesSize, sizeof(int) );
    char* lpBuf = pData + sizeof(int);
    int nTempSize = nBytesSize - sizeof(int);
    while( nBytesRecv < nTempSize ) 
    {
    if( (dwBytes = Receive( lpBuf + nBytesRecv, nTempSize - nBytesRecv )) 
    == SOCKET_ERROR ) 
    {
    if( GetLastError() != WSAEWOULDBLOCK ) {
    delete [] pData;
    Clear();
    return;
    }
    }
    else 
    {
    TRACE( "Recv size = %d \n", dwBytes );
    nBytesRecv += dwBytes;
    }
    }
      

  5.   

    谢谢: coolgong(酷龙)大哥啦!
      

  6.   

    不过好象一个SOCKET套接字一次传送的字节数有一个最大限度,如果我在发送一个文件的中途又有其他的数据发送,我该如何判断这个是否就是传送文件的那个数据包里面的内容呢??
      

  7.   

    to : ww51xh(黑心狼)  加入文件标示flag啊,要举一反三啊,
    to :ww09124(wangwei) 那就读到错误为止了,不过这样很不好。呵呵,
      

  8.   

    to: coolgong(酷龙)非常感谢你的指教,以后我还会有问题请教,你的QQ是多少啊
    我的是  19062916