使用SocketAsyncEventArgs进行异步套接字操作超时

时间:2015-03-20 14:17:54

标签: c# sockets asynchronous timeout

似乎无法在.NET AcceptAsync()类的Socket方法上指定超时。它接受SocketAsyncEventArgs

if (!socket.AcceptAsync(awaitable.EventArgs))
   doasync();
else
   dosync();

有关如何在特定时间范围后使此方法超时的任何建议?它似乎也适用于ReceiveAsync()方法。

Socket本身有一些超时值,如ReceiveTimeout,但文档表明它们不适用于异步方法。

1 个答案:

答案 0 :(得分:0)

ReceiveTimeout没有人们想象的那么有用。除此之外,它仅适用于同步Receive()方法调用,还有一个超时发生后套接字不可用。无法在套接字上进行接收操作超时,然后从同一套接字恢复读取。

因此,无论操作类型如何,总是有效的替代方案都可以。具体做法是:

  • 为您想要的超时时间设置计时器
  • 尝试操作
  • 如果操作在超时之前完成,则禁用计时器(或者如果完成操作后立即再次尝试操作,则重新启动计时器)
  • 如果操作在超时前完成,关闭套接字

关闭套接字将导致任何挂起的I / O操作完成异常。当然,关闭套接字后,您将无法再次使用该套接字。但这就是底层套接字API的工作原理,所以这不是问题。

请注意,您的计时器和套接字操作正在竞争。因此,不仅要实现定时器,还要同步操作和定时器,这一点很重要。例如。使用volatile bool标志表示操作已成功完成,即使调用了计时器处理程序,也不应该关闭套接字。