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