通过环回在 C# 中发送 UDP 数据包.为什么我无法追踪它们

本文关键字:为什么 数据包 追踪 UDP | 更新日期: 2023-09-27 18:37:14

我已经用谷歌搜索并搜索了stackoverflow,但我找不到与我的问题相关的任何内容。

首先,让我简要描述一下当时的场景。

想象一下,一台相机通过UDP通过网络发送JPEG的所有时间片段(从现在开始,我称之为"块")。使用UDP是一个约束,我无法改变它,所以请不要回答"你为什么不使用TCP?",因为你知道我的观点:"因为我不能"。

另一方面,客户端接收凸轮发送的块。为了构建一种流量控制,我在数据报的开头设置了三个字段(三个字节来存储 JPEG 编号、块索引、块的数量),然后是块本身。

目前,我正在自己的笔记本电脑中通过环回(127.0.0.1)发送和接收双方进行测试,但问题是,当相机(发送者)说它已正确发送所有块时(我正在使用一张JPEG图片进行测试,该图片被分成161个块)客户端收到随机数量的片段(有时接近70, 其他一些 100 个,还有几倍全部)。我尝试使用 rawcap (http://www.netresec.com/?page=RawCap) 嗅探我的环回,它检测到另一个数量的 UDP"数据报",不同于 161(应该发送),并且与客户端声称已收到的数量不同。

那么,发送句子是否有可能没有按预期工作?还有其他继续调查的建议吗?

这是我的发送方法。

    private void startSendingData(IPEndPoint target)
    {
        fatherForm.writeMessage("START command received. Sending data to " + target.Address.ToString() + " port " + target.Port.ToString() + "...");

        //Get chunks prepared
        List<byte[]> listOfChunks = getChunksInAList(collectFiles());
        List<uint> chunksSucces = new List<uint>();
        List<uint> chunksFailed = new List<uint>();
        byte[] stopDatagram = getStopDatagram();
        //Initialise the socket
        Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        Stopwatch sw = Stopwatch.StartNew();                       
        foreach (byte[] chunk in listOfChunks)
        {
            if (s.SendTo(chunk, target) == chunk.Length)
                chunksSucces.Add(BitConverter.ToUInt32(chunk,sizeof(uint)));
            else
                chunksFailed.Add(BitConverter.ToUInt32(chunk, sizeof(uint)));
        }
        Debug.WriteLine(chunksSucces.Count + " sent successfully");
        //Tell the receiver not to continue receiving
        s.SendTo(stopDatagram, target);
        long ellapsedMs = sw.ElapsedMilliseconds;
        sw.Stop();
        writeTransmissionRate(listOfChunks.Count, ellapsedMs);
        Debug.WriteLine(sw.ElapsedMilliseconds + "ms ellapsed");
        sw.Stop();
        s.Close();
    }

输出为:

161 chunks to be sent
161 sent successfully
6ms ellapsed
Transmission rate: 37000.65KB/s 36.13MB/s

但在另一边,我在这个测试中只收到了 22 个数据报。

提前谢谢你。

通过环回在 C# 中发送 UDP 数据包.为什么我无法追踪它们

不能

保证UDP。如果您的接收函数处理数据包的速度不够快,则网络堆栈可能会丢弃数据包。

尝试放慢速度发送它们,或增加 UDP 接收缓冲区: