如何确保接收到整个数据包
How to ensure the whole packet is received
public void read(byte[] bytess)
{
int davar = this.clientSocket.Receive(bytess);
MemoryStream m = new MemoryStream(bytess);
BinaryFormatter b = new BinaryFormatter();
m.Position = 0;
SPacket information = b.Deserialize(m) as SPacket;
Image imageScreenShot = information.ScreenShot;
if (information.Premissionize)
Premitted = true;
if (information.Text != "")
{
cE.GetMessageFromServer(information.Text);
}
if (imageScreenShot == null)
return;
Bitmap screenShot = new Bitmap(imageScreenShot);
cE.UpdatePhoto(screenShot);
//screenShot.Dispose();
//Form1.t.Text = forText;
}
我在客户端中有这个读取功能,当我运行它在 2 台局域网计算机之间联机时抛出反序列化异常。
我猜有些东西延迟了所有数据包并且只有一部分已经到达。它说二进制 header 无效。
如何在 C# 中确保我得到了整个数据包?
顺便说一句,这是 TCP
Receive 函数至少读取一个字节,最多读取与已发送的字节一样多的字节。现在您假设一次读取将读取所有内容,但事实并非如此。
从 new NetworkStream(socket)
反序列化。这允许 BinaryFormatter
从套接字中提取字节。
你在那里写的关于数据包被延迟的内容是不准确的。 TCP 使您免受此影响。
public void read(byte[] bytess)
{
int davar = this.clientSocket.Receive(bytess);
MemoryStream m = new MemoryStream(bytess);
BinaryFormatter b = new BinaryFormatter();
m.Position = 0;
SPacket information = b.Deserialize(m) as SPacket;
Image imageScreenShot = information.ScreenShot;
if (information.Premissionize)
Premitted = true;
if (information.Text != "")
{
cE.GetMessageFromServer(information.Text);
}
if (imageScreenShot == null)
return;
Bitmap screenShot = new Bitmap(imageScreenShot);
cE.UpdatePhoto(screenShot);
//screenShot.Dispose();
//Form1.t.Text = forText;
}
我在客户端中有这个读取功能,当我运行它在 2 台局域网计算机之间联机时抛出反序列化异常。
我猜有些东西延迟了所有数据包并且只有一部分已经到达。它说二进制 header 无效。
如何在 C# 中确保我得到了整个数据包?
顺便说一句,这是 TCP
Receive 函数至少读取一个字节,最多读取与已发送的字节一样多的字节。现在您假设一次读取将读取所有内容,但事实并非如此。
从 new NetworkStream(socket)
反序列化。这允许 BinaryFormatter
从套接字中提取字节。
你在那里写的关于数据包被延迟的内容是不准确的。 TCP 使您免受此影响。