.NET Compact Frameworkを使用して、Windows CE上で比較的基本的なTCPソケット送受信操作を実行しようとしています。タイムアウト値を設定して、永久にブロックするのではなく、遅い接続タイムアウトで読み書きを試みています。完全なフレームワークでは、Socket
オブジェクトのReceiveTimeout
とSendTimeout
のプロパティを設定するだけです。残念ながら、これらのプロパティをコンパクトなフレームワークに設定すると、サポートされていないソケットオプションを使用することについてSocketExceptionが発生します。Windows CEでのネットワークタイムアウトの適切な処理
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は、タイムアウトをサポートしているようには見えません。
はさらに少し掘り後、私は次のように述べていthisページに出くわしました。応答が遅い接続では、最終的にタイムアウトが発生しますが、約1分かかることがあります(WinCEのどこかにハードコードされている必要があります)。だから今私は手動でこれを実装する方法を把握しようとしています。私の最初の考えは、WaitOne(timeout)
を可能にする非同期IOを使用することです。しかし、これによって、EndSend()
またはEndReceive()
にスタックされる非同期スレッドは停止しません。私のメインスレッドをタイムアウトさせることができたとしても、ハードコードされたタイムアウトが当たってしまうまで、スレッドはまだ残っています。この間、私のアプリケーションは正常にシャットダウンされません。この問題を回避するには、非同期スレッドを中止するしかありませんが、これは非常に悪い考えですが、回避したいと思います。
これを処理する正しい方法は何ですか?他のアプリケーション(WinCE上のIEなど)が保留中のネットワーク操作をタイムアウトまたはキャンセルするように見えず、問題なくシャットダウンできるように思われるため、簡単な方法が必要です。
あなたはサンプルコードを教えてください。 –
きちんとした解決策ですが、Windows CEでタイムアウトの問題を解決していないのですか?これをWindows CE 6.0で試してみると、20秒後にタイムアウトが発生し、それを調整することができませんでした。たとえば、https://stackoverflow.com/questions/44566777/tweak-timeout-period-for-socket-connections-on-windows-ceを参照してください。 – AlainD