【发布时间】:2016-04-16 06:55:18
【问题描述】:
大家好
是否有可能通过 LAN 发送多播数据包导致部分或至少 50% 的数据包丢失。
我的应用程序使用多播数据包,在发送这些数据包时,有时我只收到 1 个,其他时候 2 个。我只收到了 2 次我发送的所有数据包。
这是我为查看返回/接收哪些数据包所做的测试。发送了 5 个数据包,但并非全部返回(F - 发送数据包序列中的最终数据包)
2000 个随机字符用于这些测试。
12345 14F
12345 134F
12345 1F
12345 1
12345 1
12345 1F
12345 134F
我总是至少收到 1 个数据包。我理解 Multicast = UDP,但是丢了这么多包似乎不太正常。
发送多播数据包:
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))
{
_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));
int count = MSGS_TO_SEND.Count;
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();
并接收:
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);
}
更新
一些有趣的结果 - Kudo 向 Seth 提出建议
在测试了防火墙建议后,我得到了一些改进,但仍然有丢包:
我禁用了卡巴斯基防火墙,默认恢复为 Windows 10 Defender 防火墙:
12345 234F
12345 234F
12345 1234F
12345 1F
12345 14F
12345 234F
12345 1
12345 1
12345 234F
禁用卡巴斯基防火墙后,我将 byte[] 大小从 1024 更改为 512,因此每个数据包仅发送 256 个字符(线程休眠时间为 20 毫秒),结果显着改善:
123456789 2345678F
123456789 2345678F
123456789 2345678F
123456789 2345678F
123456789 2345678F
只有我的第一个数据包被丢弃,但这是一个很大的进步!
【问题讨论】:
-
环境因素会导致UDP丢包,如低RSSI(低信噪比)。
-
是的,有可能,虽然可能性不大,但可能涉及一些程序员的错误。
-
@tinky_winky 需要详细说明,程序员的错误 - 这是否指的是我的代码中的错误,因为这是改编自多播教程 :p 但是这个程序员的一般错误,我认为这也指大量应用程序发送 1000 个 udp 数据包,在我的情况下,5 个数据包中有 3 个不返回......这似乎不正常
-
我真的很想帮助你,但是技术已经变成了 C#,谢天谢地我不太了解。
-
@tinky_winky 对于任何误解我深表歉意,我想我需要更改一个标签左右。这是我引用和编码的 C#。
标签: c# sockets networking network-programming udp