C#UDP Socket.ReceiveFrom超时,不使用BeginReceiveFrom或Exceptions

C#UDP Socket.ReceiveFrom超时,不使用BeginReceiveFrom或Exceptions,c#,multithreading,sockets,udp,C#,Multithreading,Sockets,Udp,我正在尝试实现一个基本的UDP客户端。它的功能之一是能够探测计算机以查看UDP服务器是否正在侦听。我需要快速扫描这些计算机 我无法使用Socket.BeginReceiveFrom方法并运行超时等待它完成,因为超时结束后可能会发生回调,并且由于许多计算机正在快速被探测,我发现后来的回调最终使用修改过的数据,因为当回调最终被调用时,新的探测已经开始了 我无法使用Socket.ReceiveFrom方法并设置Socket.ReceiveTimeout,因为抛出并处理SocketException需要

我正在尝试实现一个基本的UDP客户端。它的功能之一是能够探测计算机以查看UDP服务器是否正在侦听。我需要快速扫描这些计算机

我无法使用
Socket.BeginReceiveFrom
方法并运行超时等待它完成,因为超时结束后可能会发生回调,并且由于许多计算机正在快速被探测,我发现后来的回调最终使用修改过的数据,因为当回调最终被调用时,新的探测已经开始了

我无法使用
Socket.ReceiveFrom
方法并设置
Socket.ReceiveTimeout
,因为抛出并处理
SocketException
需要很长时间(不确定原因,我没有运行太多代码来处理它),这意味着每台计算机大约需要2秒,而不是100毫秒

是否有任何方法可以在对
ReceiveFrom
的同步调用上运行超时,而不使用异常来确定调用何时失败/成功?还是有一种你认为有效的策略我还没有采取


非常感谢您的建议。

我决定使用TCP重写探测代码


然而,我后来发现了
Socket.receivefromsync
方法,因为它每次调用只接收一个数据报,所以会让生活更轻松。

您可以将某种cookie传递给
BeginReceiveFrom
,然后返回回调,然后,您可以使用它来确定回调是否来自您期望的服务器。我尝试了这一点,但发现如果回调延迟,另一个探测可能已经启动并更改了cookie将被检查的地址:/为每个
BeginReceiveFrom
调用使用单独的新cookie。