我有一个 TCPClient,它创建了一个我在 DataAvailable 时读取的流。
每 20 秒 !DataAvailable 我使用 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);
我的关闭功能:
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);