gpt4 book ai didi

c# - 不是通过网络发送的多播数据包返回

转载 作者:行者123 更新时间:2023-12-03 12:04:29 24 4
gpt4 key购买 nike

美好的一天。

我的软件使用多播组发送消息,但是应用程序充当客户端和服务器,因此它发送 udp 数据包并接收它们。

这是使用包含 2 000 个字符的文本进行测试的。

我创建了一个包含 byte[1024] 数组的队列,其中包含需要发送的数据。

问题:

问题在于接收这些多播数据包,在发送的 5 个数据包中,我大多只收到 1 个,经常收到 2 个,等等,而且我收到了所有这些数据包的次数很少。

发送和接收结果如下:

  • 发送的数据包:发送 1、2、3、4、5
  • 返回的数据包:1、2、3、4、F(F是序列中的最后一个数据包,即关闭数据包)

  • 12345 134F

    12345 1F

    12345 134F

    12345 14F

    12345 1F

    12345 1F

    12345 1

    12345 1

    12345 1

    12345 1234F

    12345 1F

    12345 1

    12345 1

    12345 1

    12345 14F

    12345 1F

    12345 1F

    12345 1

    12345 1

    12345 1

    12345 1F

    12345 1



    发送组播包如下:
            Socket _listener_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    foreach (IPAddress localIP in Dns.GetHostAddresses(Dns.GetHostName()).Where(i => i.AddressFamily == AddressFamily.InterNetwork))
    {
    //handle image and files
    _listener_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(_MultiIP, localIP));
    _listener_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 1);
    _listener_socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    _listener_socket.MulticastLoopback = true;
    _listener_socket.Connect(new IPEndPoint(_MultiIP, _PORT));
    while (count > 0)
    {
    count--;
    byte[] temp = (byte[])(MSGS_TO_SEND.Dequeue());
    _listener_socket.Send(temp, _BYTE_BUFFER_SIZE, SocketFlags.None);
    MSGS_TO_SEND.Enqueue(temp);
    }
    }
    _listener_socket.Close();

    一个线程用于接收数据包并将它们添加到队列中进行处理,第二个线程用于处理。 2个线程的原因可能是接收线程中的处理过多导致了这种“丢包”,但不幸的是它没有解决问题

    接收线程:
    //initialise multicast group and bind to interface
    Socket _sender_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    IPEndPoint ipep = new IPEndPoint(IPAddress.Any, _PORT);
    _sender_socket.Bind(ipep);
    IPAddress localip = _MultiIP;
    _sender_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(localip, IPAddress.Any));
    Q_RECIEVE = new Queue<char[]>();
    while (_sender_socket.IsBound && !bStop)
    {
    byte[] b = new byte[_BYTE_BUFFER_SIZE];
    _sender_socket.Receive(b);
    char[] chars = new char[_BYTE_BUFFER_SIZE];
    System.Buffer.BlockCopy(b, 0, chars, 0, b.Length);
    Q_RECIEVE.Enqueue(chars);
    }

    最佳答案

    它们有可靠的 UDP 协议(protocol)和库。我以前使用过 UDT ( http://udt.sourceforge.net/ ),效果很好。我不知道它的 C# 包装器,但可能有一个或另一个可靠的 UDP C# 实现。

    除此之外,还有一些其他的建议:

  • 多播在交换机上最有问题。如果可以的话,试着改变它们。有时它也可能是路由器的问题,因此,如果可能的话,您也可以尝试更改它们。
  • 尝试发送更少的数据包(或减少发送频率)。如果您低于 1500 字节,数据包长度应该不是什么大问题,但是,您也可以尝试减少长度。
  • 为确保您的代码中没有因某种原因丢失数据包,请使用数据包嗅探器并查看数据包是否真的到达了您的目标计算机。 WireShark 有一个足够好的 GUI,但也有几个基于 GUI 和 CLI 的。
  • 关于c# - 不是通过网络发送的多播数据包返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34729192/

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