5

VB.net では、TcpClient を使用してデータの文字列を取得しています。クライアントが接続されているかどうかを確認するために .Connected プロパティを常にチェックしていますが、クライアントが切断されても true を返します。この問題の回避策として何を使用できますか?

これは私の現在のコードの簡素化されたバージョンです:

Dim client as TcpClient = Nothing
client = listener.AcceptTcpClient
do while client.connected = true
   dim stream as networkStream = client.GetStream()
   dim bytes(1024) as byte
   dim numCharRead as integer = stream.Read(bytes,0,bytes.length)
   dim strRead as string = System.Text.Encoding.ASCII.GetString(bytes,0,i)
loop

クライアントが切断された場合、少なくとも GetStream() 呼び出しは例外をスローすると考えていましたが、他のアプリを閉じましたが、まだそうではありません...

ありがとう。

編集 Client.Available のポーリングが提案されましたが、問題は解決しません。クライアントが「実際に」接続されていない場合、利用可能なものは 0 を返します。

重要なのは、接続を開いたままにし、同じソケット接続でデータを複数回受信できるようにすることです。

4

4 に答える 4

6

NetworkStream.Read が 0 を返す場合、接続は閉じられています。参考

読み取り可能なデータがない場合、NetworkStream.Read メソッドは、データが使用可能になるまでブロックされます。ブロックを回避するために、DataAvailable プロパティを使用して、データが受信ネットワーク バッファーで読み取り用にキューに入れられているかどうかを判断できます。DataAvailable が true を返す場合、読み取り操作はすぐに完了します。Read オペレーションは、size パラメーターで指定されたバイト数まで、利用可能な限り多くのデータを読み取ります。リモート ホストが接続をシャットダウンし、利用可能なすべてのデータが受信された場合、Read メソッドはすぐに完了し、0 バイトを返します。

于 2008-09-19T15:04:15.163 に答える
1

より良い答え:

if (client.Client.Poll(0, SelectMode.SelectRead))
{
    byte[] checkConn = new byte[1];

    if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
        throw new IOException();
}
于 2010-09-23T22:41:28.497 に答える
-2

client.connected をポーリングする代わりに、NetworkStream のプロパティを使用して、利用可能なデータがこれ以上ないかどうかを確認してください。

とにかく、ONDotnet.comの記事には、リスナーなどに関する大量の情報が掲載されています。問題を乗り越えるのに役立つはずです...

于 2008-09-19T13:22:02.727 に答える