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

时间:2012-04-21 03:02:36

标签: c# sockets

我使用blocing套接字编码套接字应用程序并使用多线程...我的问题是我想收到两个大数据包..我们知道tcp必须将大数据拆分成多个数据包..这个场景:

  1. 我发送6 MB文本文件和tcp拆分数据包到2个单独的数据包
  2. 同时发送26 mb视频文件,tcp也将数据包分成2个独立的数据包
  3. 在我的应用程序中我重新阅读文本文件的第一部分,让它说3 mb的6 mb
  4. 然后我收到视频的第一部分让它说13 mb 26 mb ..
  5. 问题是我怎么知道第一个文本文件包和第一个视频文件包是不同的数据,应该以不同的方式处理..(不同的缓冲区可能??)

    抱歉我的英语不好..

    提前感谢..

    我的代码的一部分

    ns = client.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;
                            }
                        }
                    }
            }
    

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

1 个答案:

答案 0 :(得分:2)

TCP协议负责制作文件段并稍后加入它们。您将收到完整的数据。