【发布时间】:2020-07-30 01:37:43
【问题描述】:
我正在为我正在开发的应用程序添加多播侦听功能。在某些情况下,我要连接的设备每秒都会发送一个多播数据包,我希望用户能够监听该数据包(如果它正在发送)。
我可以看到使用 Wireshark 的设备不断发送多播数据包,因此我知道它们存在并且我知道我正在使用正确的多播组和端口号。我已经尝试了十几种不同的方法来让我的应用程序捕获数据包,但没有任何运气。如果我从应用程序本身发送一个测试多播数据包,它接收它没有问题。我尝试接收异步和同步的数据包,没有变化。我真的很难过这个,不知道我做错了什么。我发现的每一个例子都让我相信这应该是可行的。
我的多播 udp 侦听器类:
class MulticastClient
{
private UdpClient client;
private IPEndPoint localEp;
private IPAddress multicastAddress;
public byte[] receivedData { get; private set; }
public MulticastClient(string multicastIP, int port)
{
localEp = new IPEndPoint(IPAddress.Any, port);
client = new UdpClient(AddressFamily.InterNetwork);
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
client.ExclusiveAddressUse = false;
client.Client.Bind(localEp);
this.multicastAddress = IPAddress.Parse(multicastIP);
client.JoinMulticastGroup(this.multicastAddress);
}
public async Task Listen()
{
UdpReceiveResult result = await client.ReceiveAsync();
receivedData = result.Buffer;
}
}
启动它的按钮点击:
MulticastClient client = new MulticastClient("239.255.0.1", 32768);
await Task.Run(async () =>
{
await client.Listen();
});
byte[] receivedData = client.receivedData;
if (receivedData != null)
{
//Here I display useful information about the packet to the user
}
这是一个数据包捕获的 sn-p,显示了我似乎无法接收的多播数据包: Wireshark packet capture
【问题讨论】:
-
您希望如何获得以下代码行:byte[] receivedData = client.receivedData;?你永远坐在上面的任务中。转到 Debug Break All 并查看代码在哪里运行。
-
@jdweng 你说得对,那是我尝试使用同步方法接收时剩下的。自从我使用 await 以来,它永远不会达到这一点。
-
@jdweng 我尝试了太多不同的东西。我在删除了 while(true) 的情况下进行了编辑,即使我可以在 Wireshark 上看到它们传入,仍然永远不会收到数据包。
-
在receiveData上放一个断点。你到那里了吗?如果您按 F11,您会进入下一条指令吗?如果将鼠标悬停在 receivedData 上,它是 null 还是包含字节?
-
@jdweng 如果我手动发送一个测试多播数据包,我会到达这一点,如果我让它尝试接收我在 wirehark 上看到的数据包,它会在 UdpReceiveResult result = await 客户端上永远等待。 ReceiveAsync();
标签: c# async-await multicast udpclient