c#tcp如何获取已接收的字节数?

时间:2018-09-21 08:41:44

标签: c# tcpclient tcplistener

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 :(得分:2)

读取直到没有字节为止

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

答案 1 :(得分:0)

Read返回读取的字节数:

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

因此您可以使用以下内容来构造MemoryStream

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

值得注意的是,您正在处理Stream,这意味着您可能不会一次收到所有数据。

也就是说,如果我将“ ABC”和“ DEF”作为两个单独的消息发送,则我可以通过多种方式接收它(以下一些示例):

  • ABCDEF(1个“接收”事件)
  • ABC,DEF(2个“接收”事件)
  • A,BCDE,F(3个“接收”事件)
  • ABCDE,F(2个“接收”事件)
  • A,B,C,D,E,F(6个“接收”事件)。

通常,人们会先发送一个尺寸指示符,读出来,然后用它来确定何时收到完整的“消息”。