其他分享
首页 > 其他分享> > CodeGo.net> TCPClient的流不正常?

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