2016-11-11 50 views
1

我有一个从套接字读取数据的函数。通过套接字读取的最大数据量

public int getResp(byte[] Buff, ref int rxBytes)//Buff is byte array of length 150000 bytes 
     {   
      while (socet.Available < rxBytes)//rxBytes = 150000 
      { 
       int socketAvaildata = socet.Available; 
       Thread.Sleep(1000); 
       if (socketAvaildata == socet.Available) 
        break; 
      } 
      try 
      { 
       //Thread.Sleep(100); 
       rxBytes = socet.Available;   
       if (rxBytes > 0) 
       { 
        socet.Receive(Buff, rxBytes, 0); 
        return rxBytes; 
       } 
      } 
      catch (Exception ex) 
      { 

      } 
      return -1; 
     } 

此功能效果很好,当我们要读小data.But当我们要读大量的数据(超过10个字节),它只返回数据的一部分。在dubug模式下,当socet.Available = 65536时,我已检查控制范围break。 那么它是最大限度,我们可以阅读或我做错了什么?

回答

2

Receive方法返回实际接收的字节数。因此,只要改变位:

rxBytes = socet.Receive(Buff, rxBytes, 0); 
return rxBytes; 

注意rxBytes可能少于您最初要求的字节数。为了确保您已经阅读正是字节数,使用:

public bool TryReadResponse(byte[] buffer, int expectedNumberOfBytes) 
{ 
    try 
    { 
     int remaining = expectedNumberOfBytes; 
     int offset = 0; 
     while (remaining > 0) 
     { 
      int read = socet.Receive(buffer, offset, remaining, SocketFlags.None); 
      if (read == 0) 
      { 
       // other side has closed the connection before sending the requested number of bytes 
       return false; 
      } 

      offset += read; 
      remaining -= read; 
     } 

     return true; 
    } 
    catch (Exception ex) 
    { 
     // failure 
     return false; 
    } 
} 

我删除了从参数ref的自由,因为你只是在手术是否完全成功感兴趣。