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

c#tcp如何获取接收的确切字节数?,c#,tcpclient,tcplistener,C#,Tcpclient,Tcplistener,所以问题是,当我这样做时,它会给我错误“参数无效”,我认为这是因为数组中要读取的字节数较少。有没有办法知道要从ReceivedBuffer读取多少字节?read返回读取的字节数: if(client.Available > 0) { try { byte[] bytes = new byte[18000]; client.G

所以问题是,当我这样做时,它会给我错误“参数无效”,我认为这是因为数组中要读取的字节数较少。有没有办法知道要从ReceivedBuffer读取多少字节?

read
返回读取的字节数:

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());
                }
            }
因此,您可以使用以下内容来构造
内存流

var bytesRead = client.GetStream().Read(bytes, 0, bytes.Length);
值得注意的是,您正在处理一个
,这意味着您可能无法一次性收到所有数据

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

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

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

直到没有剩余的字节为止

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

Stream.Read
返回读取的字节数。是的,对于TCP,你不能保证一次调用
Read
,就能收到所有字节,你必须循环。@BiesiGrr它返回读取的字节数(18000)@BiesiGrr你能给我一个循环的例子吗?哦,我误解了这个问题。。在发送实际数据之前,发送方需要告诉接收方它将发送多少字节。这取决于发送方和接收方之间实现的协议。许多协议使用固定大小的字节头,它包含必须等待的字节数。另一种方式是发送固定大小的消息;通过这种方式,您将知道等待多少字节和发送多少字节。@Saruman这是MongoDB聚合或我最头疼的问题:-)亲爱的downvoter:我回答了问题(“有没有办法知道从recivedBuffer读取多少字节?”),并提供了有关接收数据如何作为奖励的准确信息。不确定你的否决票是否合理。
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