C # TCP Как я могу получить точное количество байтов, которые получены? - PullRequest
0 голосов
/ 21 сентября 2018
if(client.Available > 0)
            {
                try
                {
                    byte[] bytes = new byte[18000];
                    client.GetStream().Read(bytes, 0, bytes.Length);
                    MemoryStream stream = new MemoryStream(bytes);
                    stream.Seek(0, SeekOrigin.Begin);
                    Bitmap bit = new Bitmap(stream);
                    if (!Shown)
                    {
                        Shown = true;
                        ssViewer.Show();
                        ssViewer.UpdateImage(bit);
                    }
                    stream.Close();
                }
                catch(Exception ex)
                {
                    PrintToConsole("There was an error in data " + ex.ToString(), ConsoleColor.Red);
                    MessageBox.Show(ex.ToString());
                }
            }

Так что проблема в том, что когда я делаю это, это выдает мне ошибку «Параметр недействителен», я думаю, что это потому, что в массиве меньше байтов, которые он должен прочитать. Есть способ узнать, сколько байтовтам читать из recivedBuffer?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Читать до тех пор, пока не останется байтов

byte[] buffer = new byte[2048]; // read in chunks of 2KB
int bytesRead;
while((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
    //do something with data in buffer, up to the size indicated by bytesRead
}

// yay no bytes left
0 голосов
/ 21 сентября 2018

Read возвращает количество прочитанных байтов:

var bytesRead = client.GetStream().Read(bytes, 0, bytes.Length);

, чтобы вы могли использовать следующее для построения MemoryStream:

MemoryStream stream = new MemoryStream(bytes.Take(bytesRead).ToArray());

Стоит отметить, что вы 'Мы имеем дело с Stream, что означает, что вы не можете получить все свои данные за один раз.

То есть, если я отправлю «ABC» и «DEF» как два отдельных сообщения, я смогу получитьэто может быть любым количеством способов (некоторые примеры ниже):

  • ABCDEF (1 событие «receive»)
  • ABC, DEF (2 события «receive»)
  • A, BCDE, F (3 события "приема")
  • ABCDE, F (2 события "приема")
  • A, B, C, D, E, F (6 "получение)«events».

Обычно люди сначала отправляют индикатор размера, считывают его, а затем используют его, чтобы определить, когда было получено их полное «сообщение».

...