【发布时间】:2009-05-18 20:35:06
【问题描述】:
我正在尝试使用 .NET Compact Framework 在 Windows CE 上执行相对基本的 TCP 套接字发送/接收操作。我正在尝试设置超时值,以便在慢速连接超时时读取/写入,而不是永远阻塞。在完整的框架上,我可以简单地在Socket 对象上设置ReceiveTimeout 和SendTimeout 属性。不幸的是,在紧凑框架上设置这些属性会立即导致关于使用不受支持的套接字选项的 SocketException。
进一步挖掘后,我发现this 页面显示以下内容:
下表显示了 setsockopt 不支持的 BSD 选项: 值类型 描述 SO_ACCEPTCONN BOOL 设置套接字监听。 SO_RCVLOWAT int 设置 recv 低水位线。 SO_RCVTIMEO int 设置接收超时。 SO_SNDLOWAT int 设置发送低水位线。 SO_SNDTIMEO int 设置发送超时值。 SO_TYPE int 设置套接字类型。所以看起来 Windows CE 不支持超时。超时最终会在无响应的连接上发生,但它似乎需要大约一分钟(必须在 WinCE 中的某处硬编码)。所以现在我试图弄清楚如何手动实现这一点。我的第一个想法是使用异步 IO,它允许我 WaitOne(timeout)。但是,这不会停止将卡在EndSend() 或EndReceive() 上的异步线程。因此,即使我可以使我的主线程超时,仍然会有线程徘徊,直到遇到硬编码超时。在此期间,我的应用程序将无法正常关闭。我能想到解决这个问题的唯一方法是中止异步线程,但这似乎是一个非常糟糕的主意,我想避免它。
那么处理这个问题的正确方法是什么?必须有一个简单的方法,因为其他应用程序(例如 WinCE 上的 IE)似乎没有任何问题超时或取消挂起的网络操作,而且它们似乎也能够毫无问题地关闭。
【问题讨论】:
标签: c# sockets compact-framework windows-ce