关闭或重置TcpClient连接的正确方法是什么?我们有与硬件通信的软件,但有时会出现问题,我们不能再与它通信,直到我们重新启动软件。
我尝试强制使用TcpClient.Close(),甚至将其设置为null,但都不起作用。只有完全重启软件才能正常工作。
有什么建议吗?
我不能使用using关键字,因为TpcClient只在一个位置定义,但在整个库中使用。(并且在任何给定时间只有一个连接)
它是一个处理通信的库。软件本身可以调用控制器类(表示硬件)的ResetConnection()方法。
它目前看起来像
if (tcpClient != null)
{
tcpClient.Close();
tcpClient = null;
}
现在,从我在这里读到的内容来看,我应该使用tcpClient.Dispose()而不是“= null”
我会试一试,看看会不会有什么不同。
发布于 2009-12-30 22:44:49
在关闭连接之前,必须先关闭流:
tcpClient.GetStream().Close();
tcpClient.Close();
关闭客户端不会关闭流。
发布于 2018-01-18 00:34:06
尽管有所有适当的using
语句,调用Close
,具有一些指数级的后退逻辑并重新创建TcpClient
,但我仍然看到应用程序在不重新启动应用程序的情况下无法恢复using
连接的问题。使用System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host
时,它总是失败。
但是在TcpClient
上有一个选项LingerState
,它似乎已经解决了这个问题(可能在几个月内不知道,因为我自己的硬件安装经常失败!)。参见MSDN。
// This discards any pending data and Winsock resets the connection.
LingerOption lingerOption = new LingerOption(true, 0);
using (var tcpClient = new TcpClient
{SendTimeout = 2000, ReceiveTimeout = 2000, LingerState = lingerOption })
...
发布于 2009-01-09 14:35:40
除了一些内部日志记录之外,关闭== Dispose。
Dispose调用tcpClient.Client.Shutdown( SocketShutdown.Both ),但它会吃掉任何错误。也许如果你直接调用它,你可以得到一些有用的异常信息。
https://stackoverflow.com/questions/425235
复制相似问题