2009-05-18 21 views
3

.NET Compact Frameworkを使用して、Windows CE上で比較的基本的なTCPソケット送受信操作を実行しようとしています。タイムアウト値を設定して、永久にブロックするのではなく、遅い接続タイムアウトで読み書きを試みています。完全なフレームワークでは、SocketオブジェクトのReceiveTimeoutSendTimeoutのプロパティを設定するだけです。残念ながら、これらのプロパティをコンパクトなフレームワークに設定すると、サポートされていないソケットオプションを使用することについて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など)が保留中のネットワーク操作をタイムアウトまたはキャンセルするように見えず、問題なくシャットダウンできるように思われるため、簡単な方法が必要です。

答えて

2

私はこれを行うためのきれいな方法を見つけました。基本的に私は別のスレッドで送受信をやっていて、イベントを待っています(手動または自動リセットイベントが機能するはずです)。待機時間が経過すると、ソケットを単に閉じる(または破棄する)と、他のスレッドの読み込み/書き込みのブロックが取り消され、Graceful(Send()/ Receive()呼び出しで例外がスローされます)が終了します。うまくいけば、これは誰かに役立つでしょう...

+0

あなたはサンプルコードを教えてください。 –

+0

きちんとした解決策ですが、Windows CEでタイムアウトの問題を解決していないのですか?これをWindows CE 6.0で試してみると、20秒後にタイムアウトが発生し、それを調整することができませんでした。たとえば、https://stackoverflow.com/questions/44566777/tweak-timeout-period-for-socket-connections-on-windows-ceを参照してください。 – AlainD

関連する問題