gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:01:13 25 4
gpt4 key购买 nike

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

  • 我发送 6 mb 文本文件和 tcp 将数据包拆分为 2 个单独的数据包
  • 同时我发送 26 mb 视频文件和 tcp 也将数据包分成 2 个单独的数据包
  • 在我的应用程序中,我收到了文本文件的第一部分,比如说 3 mb of 6 mb
  • 然后我收到视频的第一部分,比如说 26 mb 的 13 mb ..

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

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

    提前致谢..

    这是我的代码的一部分

    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;
    }
    }
    }
    }

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

    最佳答案

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

    关于c# - 如何在 C# 中使用 tcp 确定数据包接收是第一个数据包的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10255819/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com