2

Windowsデスクトップで実行され、.netで開発されたサーバーソフトウェアがあり、TCP/IPを介したソケットでの着信接続を常にリッスンしています。

次に、コンパクト フレームワーク 3.5 で開発された CE 6.0 でクライアント ソフトウェアを実行しています...このクライアントは次のことを行う必要があります。

  • サービスが有効なときにサーバーに接続する
  • 300 ミリ秒ごとに数バイトのデータを送信する
  • 送信中にハングアップしたり、毎回接続する時間を失ったりすることはありません
  • ソケットが接続されているかどうかを確認する

これまでのところ、このサンプルに基づいて非同期コードを使用してサーバー側を実装しましたが、サーバーが閉じるまで接続を維持するように変更しました... 1回だけでなく、完全に機能しています

http://msdn.microsoft.com/en-us/library/fx6588te.aspx

次に、クライアント側を次のように実装しました。

dim clientSocket as new System.Net.Sockets.TcpClient()

/... code .../

'Activate the service
clientSocket.Connect("10.0.0.34", myPort)

/ .... code ..../ 

'Data send function
dim serverStream as NetworkStream = clientSocket.GetStream()
dim outStream as byte() = System.Text.Enconding.ASCII.GetBytes("My messagge...")
serverStream.Write(outStream, 0, outStream.Length)
serverStream.Flush

また、これは完全に機能しています。私が必要なものは何?

  1. データを送信する前にソケットとの接続が開いているかどうかを検出する...これにより、何か問題が発生した場合の時間の損失を回避できます

Web を検索しましたが、CF でそれを行う方法がありませんでした....connected メソッドはここでは利用できません。

私が見つけた最良の方法は、接続/送信が成功したときにフラグを設定し、何か問題が発生したときにフラグをリセットすることです。

4

1 に答える 1

0

ソケットがまだ接続されているかどうかを判断するために、ソケットをポーリングする実験をしたことがあります。しかし、私の経験によると、ソケットがすでに閉じられているかどうかを判断する唯一の信頼できるデバイスに依存しない方法は、送信操作が成功するか、タイムアウトすることです。(注: そのタイムアウトを自分で確認することをお勧めします。よく覚えている場合、標準の TCP ソケットは 20 秒後にタイムアウトしますが、それより前に非標準のものをいくつか見たことがあります。幸運なことに、ソケットを介して実装しているプロトコルに「ping」メカニズムがあるため、ネットワーク上で無意味なデータを時々実行して、まだ接続があるかどうかを確認できます。かなりのオーバーヘッドが発生する可能性があることはわかっていますが、本当に知る必要がある場合は、これが絶対にすべてのデバイスで機能する唯一の方法です.

于 2012-12-12T19:17:53.807 に答える