2016-11-11 51 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的自由,因爲你只是在手術是否完全成功感興趣。