如何使用 C# 中的 tcp 确定数据包接收是第一个数据包的一部分

本文关键字:数据包 第一个 一部分 何使用 中的 tcp | 更新日期: 2023-09-27 18:31:54

>i 使用定位套接字代码并使用多线程的套接字应用程序。我的问题是我想接收两个大包。众所周知,TCP必须将大数据拆分为多个数据包。这是场景:

  1. 我发送 6 MB 文本文件和 TCP 拆分数据包为 2 个单独的数据包
  2. 同时我发送26 MB的视频文件和TCP还将数据包分成2个单独的数据包
  3. 在我的应用程序中,我接收了文本文件的第一部分,让我们说它 3 MB 的 6 MB
  4. 然后我收到视频的第一部分,让我们说它 13 MB 的 26 MB。

问题是我怎么知道第一个文本文件包和第一个视频文件包是不同的数据,应该以不同的方式处理。(也许是不同的缓冲区??

对不起,我的英语不好..

提前谢谢..

这是我代码的一部分

ns = 客户端。GetStream();

        while (isListen == true && client.Connected)
        {
                while (!ns.DataAvailable)
                {
                    try
                    {
                        Thread.Sleep(1);
                    }
                    catch (Exception ex)
                    {
                    }
                }

                data = new byte[client.ReceiveBufferSize];
                //client.Client.Receive(data);
                int indx = ns.Read(data, 0, data.Length);
                string message = Encoding.ASCII.GetString(data, 0, indx);
                if (message == GetEnumDescription(TypeData.Disconnect))
                {
                    isListen = false;
                    server.ClientKeluar = objClient;
                    if (ClientDisconnected != null)
                    {
                        ClientDisconnected(objClient);
                    }
                    thisThread.Abort();
                    Server.kumpulanThread.Remove(thisThread);
                    Server._serverConnections.Remove(this);
                    client.Close();
                }
                else if (message.Contains(GetEnumDescription(TypeData.GetFile)))
                {
                    //jalankan proses pengambilan data
                }
                else if (message.Contains(GetEnumDescription(TypeData.ByteLength)))
                {
                    string length = message.Substring(6, message.Length - 6);
                    int len = int.Parse(length);
                    expectedLength = client.ReceiveBufferSize = len;
                    data = new byte[len];
                }
                else if (message.Contains(GetEnumDescription(TypeData.Image)))
                {
                    typeData = "Image";
                    dat1 = new byte[client.ReceiveBufferSize];
                    index = 0;
                }
                else if (message.Contains(GetEnumDescription(TypeData.Video)))
                {
                    typeData = "Video";
                    dat2 = new byte[client.ReceiveBufferSize];
                    index = 0;
                }
                else
                {
                    if (typeData == "Image")
                    {
                        expectedLength = expectedLength - message.Length;
                        if (expectedLength == 0)
                        {
                            Array.Copy(data, 0, dat1, index, message.Length);
                            if (ImageDelivered != null)
                            {
                                ImageDelivered(dat1);
                            }
                        }
                        else
                        {
                            Array.Copy(data, 0, dat1, index, message.Length);
                            index = message.Length;
                        }
                    }
                    else if (typeData == "Video")
                    {
                        expectedLength = expectedLength - message.Length;
                        if (expectedLength == 0)
                        {
                            Array.Copy(data, 0, dat2, index, message.Length);
                            if (VideoDelivered != null)
                            {
                                VideoDelivered(dat2);
                            }
                        }
                        else
                        {
                            Array.Copy(data, 0, dat2, index, message.Length);
                            index = message.Length;
                        }
                    }
                    else
                    {
                        expectedLength = expectedLength - message.Length;
                        if (expectedLength == 0)
                        {
                            dataToWrite = dataToWrite + message;
                            string text = dataToWrite;
                            if (MessageDelivered != null)
                            {
                                MessageDelivered(text);
                            }
                            dataToWrite = "";
                        }
                        else
                        {
                            dataToWrite += message;
                        }
                    }
                }
        }

任何人都可以提供示例代码,以便我获得解决此问题的灵感吗?

如何使用 C# 中的 tcp 确定数据包接收是第一个数据包的一部分

TCP协议负责制作文件片段,然后加入它们。您将在接收中获得完整的数据。