DataAvailable のときに読み取るストリームを作成する TCPClient があります。
!DataAvailable の 20 秒ごとに、ACK メッセージを使用してソケットに ping を送信し、ストリームが閉じないようにします。
しかし、私はさまざまな結果を得ているようです。ストリームを開くたびに(基本的にサービスを再起動する)、トランスポートエラーが発生するようです。
これは、私の Connect 関数の短縮版です。
client = new StreamClient();
client.Connect(new IPEndPoint(clientAddress, senderPort));
stream = client.GetStream();
bool status = SendMessage(seq, sync, MessageTypes.Init);
SendMessage 関数は次のことを行います。
if (stream == null) return false;
stream.Write(TransmitBuffer, 0, TransmitMessageLength);
My Close 関数は次のことを行います。
if (stream != null)
{
SendMessage(seq, sync, MessageTypes.Finish);
stream.Close();
}
stream = null;
client.Close();
client = null;
ソケットの性質上、SendMessage 呼び出しが失敗することがあると予想されます。
しかし、一度接続すると、すべてが正常に実行され、失敗したメッセージが表示されないことがあります。しかし、ACK が失敗する場合もあります。ACK が失敗すると、Close を呼び出します。これにより、Connect が強制され、ソケットのもう一方の端が開いていることが検証されます。それが失敗した場合、私はその終わりがダウンしていることを知っています. ただし、その呼び出しが失敗せず、20 秒後に ACK が失敗する場合があります。
なぜこれが起こるのかについて誰かが私に意見を与えることができますか? 20 秒待つには長すぎますか? ソケットの端を適切に閉じていませんか?
私が戦っている特定のエラーメッセージは次のとおりです。
Unable to write data to the transport connection: An established connection was aborted by the software in your host machine.
そして、それはで発生しますstream.Write(TransmitBuffer, 0, TransmitMessageLength);