84

TcpClient 接続を閉じたりリセットしたりする正しい方法は何ですか? ハードウェアと通信するソフトウェアがありますが、何か問題が発生し、ソフトウェアを再起動するまで通信できなくなることがあります。

TcpClient.Close() を強制して null に設定しようとしましたが、うまくいきません。ソフトウェアの完全な再起動のみが機能します。

提案?


TpcClient は 1 つの場所でしか定義されておらず、ライブラリ全体で使用されているため、using キーワードは使用できません。(そして、常に 1 つの接続しかありません)

通信を扱うライブラリです。ソフトウェア自体は、Controller クラス (ハードウェアを表す) の ResetConnection() メソッドを呼び出すことができます。

現在のように見えます

if (tcpClient != null)
{
    tcpClient.Close();
    tcpClient = null;
}

ここで読んだことから、「= null」の代わりに tcpClient.Dispose() を使用する必要があります

試してみて、違いがあるかどうかを確認します。

4

8 に答える 8

98

接続を閉じる前に、ストリームを閉じる必要があります。

tcpClient.GetStream().Close();
tcpClient.Close();

クライアントを閉じても、ストリームは閉じられません。

于 2009-12-30T14:44:49.223 に答える
22

使用語: using. プログラミングの良い習慣。

using (TcpClient tcpClient = new TcpClient())
{
     //operations
     tcpClient.Close();
}
于 2009-01-08T18:42:13.183 に答える
6

一部の内部ログを除いて、閉じる == 破棄します。

Dispose は tcpClient.Client.Shutdown( SocketShutdown.Both ) を呼び出しますが、エラーが発生します。直接呼び出すと、有用な例外情報を取得できる場合があります。

于 2009-01-09T14:35:40.367 に答える
6

ソケット接続を閉じて、ソケットの再利用を許可します。

tcpClient.Client.Disconnect(false);
于 2009-08-13T23:57:19.080 に答える
1

TcpClient.Dispose()を明示的に呼び出してみましたか?

そして、TcpClient.Close() と TcpClient.Dispose() を使用したすべての接続があると確信していますか?

于 2009-01-08T18:16:40.583 に答える