【问题标题】:Properly handling network timeouts on Windows CE在 Windows CE 上正确处理网络超时
【发布时间】:2009-05-18 20:35:06
【问题描述】:

我正在尝试使用 .NET Compact Framework 在 Windows CE 上执行相对基本的 TCP 套接字发送/接收操作。我正在尝试设置超时值,以便在慢速连接超时时读取/写入,而不是永远阻塞。在完整的框架上,我可以简单地在Socket 对象上设置ReceiveTimeoutSendTimeout 属性。不幸的是,在紧凑框架上设置这些属性会立即导致关于使用不受支持的套接字选项的 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


    【解决方案1】:

    我找到了一个干净的方法来做到这一点。基本上我在一个单独的线程中进行发送和接收,然后等待一个事件(手动或自动重置事件应该有效)。如果等待超时,那么简单地关闭(或处置)套接字将取消另一个线程中的阻塞读/写,从而导致该线程上的优雅退出(在 Send()/Receive() 调用上引发异常)。希望这对其他人有所帮助...

    【讨论】:

    • 很好的解决方案,但我认为您还没有解决 Windows CE 中的超时问题?当我在 Windows CE 6.0 上尝试此操作时,我在大约 20 秒后超时,我无法对其进行调整。例如:stackoverflow.com/questions/44566777/…
    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多