CodeGo.net> TCPClient的流不正常?
作者:互联网
我有一个TCPClient,它创建一个在DataAvailable时从中读取的流.
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);
我的关闭函数可以:
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);
解决方法:
在您的实现中,我看到的主要内容是,您好像将Stream视为Connection,而事实并非如此.相反,您对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连接,读取和写入.同步的比较容易,但是我的经验是依靠它们会给您带来麻烦.
标签:tcpclient,c 来源: https://codeday.me/bug/20191031/1975301.html