gpt4 book ai didi

c# - TCPClient 流不规则?

转载 作者:行者123 更新时间:2023-11-30 15:35:53 28 4
gpt4 key购买 nike

我有一个 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,这将强制连接并验证套接字的另一端是否打开。如果那失败了,那么我知道那结束了。但有时该调用不会失败,然后 20 秒后 ACK 会失败。

谁能告诉我为什么会发生这种情况?等待 20 秒是否太长?我没有正确关闭 socket 的末端吗?

我遇到的具体错误信息是:

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);

最佳答案

我在您的实现中看到的最让我印象深刻的事情是您似乎将流视为连接,但事实并非如此。您对 Stream 实例的检查应该改为对 TcpClient 实例的检查。我不确定这是否是您问题的根源,但对我来说肯定很奇怪。

取而代之的是:

stream = client.GetStream();
if (stream != null)
{
SendMessage(seq, sync, MessageTypes.Finish);
stream.Close();
}
stream = null;

我通常会做这样的事情:

if (client != null)
{
if (client.Connected)
{
client.GetStream().Close();
}

client.Close();
client = null;
}

在使用流之前,您应该检查 TcpClient.Connected,而不是流本身。
我要提到的另一件事是确保始终使用异步方法与您的 TcpClient 进行连接、读取和写入。同步的更容易,但我的经验是依赖它们会给你带来麻烦。

关于c# - TCPClient 流不规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14390970/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com