我有一台服务器,它接收来自客户端的连接请求。该服务器使用异步Socket.BeginReceive
和Socket.EndReceive
方法。该代码与here找到的代码非常相似。
就我而言,在调用Socket.BeginReceive
之后,我需要超时,以便如果客户端挂接到连接但在固定的时间内完全不传输任何数据,则需要终止连接。
在这种情况下连接?
计时器?
最佳答案
只需调用套接字的Close()
方法即可。此后,回调方法将很快运行,调用ObjectDisposedException
方法时,您将获得EndReceive()
。准备捕捉该异常。
您可能不想阻止名为BeginReceive
的线程,需要使用System.Threading.Timer
或System.Timers.Timer
来检测超时。其回调应调用Close()
。当心这种不可避免的竞争条件,如果在计时器到期前一微秒内收到响应,则计时器的回调将运行。即使您获得了良好的响应,您仍将关闭套接字。下一次对BeginReceive()
的调用将立即失败。
关于C#:如何在Socket.BeginReceive回叫之前终止套接字?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1921611/