私は30台の車のモデムからのメッセージを聞いているアプリケーションを持っています。私は(エラー処理は省略さ)次のようになり、サーバーのコードを実装するTcpListenerを使用しました:なぜTcpListenerはESTABLISHED接続を漏らしていますか?
...
listener.Start()
...
void
BeginAcceptTcpClient()
{
if(listener.Server.IsBound) {
listener.BeginAcceptTcpClient(TcpClientAccepted, null);
}
}
void
TcpClientAccepted(IAsyncResult ar)
{
var buffer = new byte[bufferSize];
BeginAcceptTcpClient();
using(var client = EndAcceptTcpClient(ar)) {
using(var stream = client.GetStream()) {
var count = 0;
while((count = stream.Read(buffer, total, bufferSize - total)) > 0) {
total += count;
}
}
DoSomething(buffer)
}
私が正しくメッセージを取得し、私の問題は、切断です。 12時間ごとにモデムがリセットされ、新しいIPアドレスが取得されますが、サーバーは古い接続をアクティブに保ち続けます(tcpviewにESTABLISHEDとしてマークされています)。古い接続のタイムアウトを設定する方法はありますか?私は、TcpClientを閉じることで、TCP接続が閉じられたと思っていました(ローカルテストではどうなりますか)、間違っていますか?
私は、接続の受け入れにAsync APIを使用していますが、メッセージを読み取るための同期APIは1時間に1回または2回しかありません。私は、モデムがサーバに接続する方法(ハードウェアプロバイダがそれらを制御し、その動作を非常にうまく説明できなかった)をあまり制御できません。受け入れられたTcpClientのDispose()はクライアントとの接続を終了しませんか?私の問題は、クライアントが私の上で死んでいるということではなく、私の問題は彼らがIPを変えたときに彼らが死なないということです! –
@Pabloあなたは明確にすることができます:一度クライアントが接続した - それはすぐにいくつかのデータを送信しますか?それともしばらく開いていますか? –
クライアントが接続し、いくつかのデータを送信して...クローズしますか?それは問題の一部ですが、わかりません。私は接続のリセット(正常に受け入れられ、部分的なデータが使用されています)を受信しましたが、モデムを手動でリセットしても接続は常にESTABLISHED状態に保たれているようです。 –