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

时间:2012-06-13 12:12:23

标签: c# udp client-server packet-sniffers

我已经使用Google搜索并搜索了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个数据报。

提前谢谢。

1 个答案:

答案 0 :(得分:3)

无法保证UDP。如果您的接收功能没有足够快地处理它们,网络堆栈可能正在丢弃数据包。

尝试慢一点,或增加UDP接收缓冲区: