如何确保收到整个数据包

时间:2015-06-27 09:43:32

标签: c# sockets tcp packets

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台计算机之间在线运行时,会抛出反序列化异常。

我猜这个延迟了所有数据包的东西,只有部分数据包到了。它说二进制标头无效。

如何在C#中确保我收到了整个数据包?

顺便说一下,这是 TCP

1 个答案:

答案 0 :(得分:3)

接收功能至少读取一个字节,最多读取已发送的字节数。现在你假设一个读取将读取所有不是这种情况。

new NetworkStream(socket)反序列化。这允许BinaryFormatter从套接字中提取字节。

你在那里写的关于数据包被延迟的内容并不准确。 TCP可以保护你。