我正在尝试使用.NET Compact Framework在Windows CE上执行相对基本的TCP套接字发送/接收操作。我正在尝试设置超时值,以便在慢速连接超时读取/写入而不是永久阻塞。在完整框架上,我只需在ReceiveTimeout
对象上设置SendTimeout
和Socket
属性即可。不幸的是,在紧凑框架上设置这些属性会立即导致使用不受支持的套接字选项的SocketException。
在进一步挖掘之后,我遇到了this页面,其中包含以下内容:
The following table shows BSD options not supported for setsockopt: Value Type Description SO_ACCEPTCONN BOOL Sets socket listening. SO_RCVLOWAT int Sets recv low watermark. SO_RCVTIMEO int Sets time-out for recv. SO_SNDLOWAT int Sets send low watermark. SO_SNDTIMEO int Sets time-out value for send. SO_TYPE int Sets socket type.
所以它看起来不像Windows CE支持超时。在无响应的连接上最终会发生超时,但似乎需要大约一分钟(必须在WinCE中的某处硬编码)。所以现在我想弄清楚如何手动实现它。我的第一个想法是使用异步IO,允许我WaitOne(timeout)
。但是,这不会阻止将卡在EndSend()
或EndReceive()
上的异步线程。因此,即使我可以超时我的主线程,仍然会有线程挥之不去,直到硬编码超时被击中。在此期间,我的应用程序将无法正常关闭。我能想到解决这个问题的唯一方法是中止异步线程,但这似乎是一个非常糟糕的主意,我想避免它。
那么处理这个问题的正确方法是什么?必须有一个简单的方法,因为其他应用程序(例如WinCE上的IE)似乎没有任何问题超时或取消待处理的网络操作,他们似乎也能够顺利关闭。
答案 0 :(得分:2)
我找到了一个干净的方法来做到这一点。基本上我在一个单独的线程中进行发送和接收,然后等待事件(手动或自动重置事件应该工作)。如果等待超时,那么简单地关闭(或处理)套接字将取消另一个线程中的阻塞读/写,从而导致该线程上的优雅(在Send()/ Receive()调用上抛出异常)。希望这对其他人有帮助......