【发布时间】:2019-05-29 22:41:42
【问题描述】:
我有一个函数可以监听特定端口上的 UDP 数据包。每当我收到数据时,我希望函数停止在该端口上接收数据,等待 5 秒,然后继续侦听数据。基本流程是:
- 监听 UDP 数据包。
- 接收 UDP 数据包并对该数据进行任何必要的处理。
- 阻止传入的 UDP 数据包并等待 5 秒。
- 重复。
我的功能正常工作,但我不知道如何在 5 秒的等待期内阻止 UDP 数据包。我在UdpClient 上使用了EnableBroadcast 布尔值,但它什么也没做。我还尝试将Broadcast 和BlockSource 的SocketOptionName 设置为true/false,但它什么也没做。
private async void ReceiveUdpPackets()
{
await Task.Run(async () =>
{
try
{
while (receivePackets)
{
Log.Info("Listening for UDP packets...");
listener.Client.SetSocketOption(SocketOptionLevel.Udp, SocketOptionName.BlockSource, false);
byte[] bytes = listener.Receive(ref groupEP);
listener.Client.SetSocketOption(SocketOptionLevel.Udp, SocketOptionName.BlockSource, true);
Log.Info($"Received UDP broadcast from {groupEP} :");
Log.Info($"{Encoding.ASCII.GetString(bytes, 0, bytes.Length)}");
var bString = BitConverter.ToString(bytes).Replace("-", "");
Log.Info("UDP ByteString: " + bString);
DecodeByteString(bString);
await Task.Delay(5000);
}
}
catch (Exception ex)
{
Log.Error("There was an issue decoding the UDP packet: " + ex.ToString());
}
});
}
【问题讨论】:
-
SocketOptionName.BlockSource不是SocketOptionLevel.Udp的有效选项。它用于SocketOptionLevel.IP,而不是管理多播成员资格。使 UDP 套接字停止侦听数据包的唯一方法是关闭套接字。否则,我建议将套接字移动到另一个线程,或使用异步读取,在这 5 秒内监视并丢弃任何新数据,然后您可以在准备好时检索套接字或取消读取。 -
您关心传入的 UDP 数据报会发生什么吗?你能简单地阅读它们而不用它们做任何事情...... 5 秒钟?还是您希望远程对等方在尝试发送它们时失败?
-
个人来说,我只用signalr,它会更容易设置,更容易维护,更容易做对