关闭或重置TcpClient连接的正确方法是什么? 我们有软件可以与硬件进行通信但有时会有些东西 出错了,我们不再与之沟通,直到我们重新启动软件。
我尝试强制使用TcpClient.Close(),甚至将其设置为null但这不起作用。 只需完全重启软件即可。
建议?
我无法使用using关键字,因为TpcClient仅在一个位置定义,但在整个库中使用。 (并且在任何给定时间只有一个连接)
这是一个处理通信的库。软件本身可以调用Controller类的ResetConnection()方法(代表硬件)。
目前看起来像
if (tcpClient != null)
{
tcpClient.Close();
tcpClient = null;
}
现在从我在这里读到的,我应该使用tcpClient.Dispose()而不是“= null”
我会尝试一下,看看它是否有所作为。
答案 0 :(得分:76)
您必须在关闭连接之前关闭流:
tcpClient.GetStream().Close();
tcpClient.Close();
关闭客户端不会关闭流。
答案 1 :(得分:21)
鉴于接受的答案已经过时,我在其他答案中没有看到任何关于此的答案,我正在创建一个新答案。在.Net 2和更早版本中,您必须在关闭连接之前手动关闭流。在C#中TcpClient
的所有更高版本中都修复了该错误,并且正如Close method的文档中所述,对方法Close
的调用会关闭连接和流
根据Microsoft Docs编辑
Close方法将实例标记为已处置并请求该实例 关联套接字关闭TCP连接。基于LingerState 属性,TCP连接可能会在一段时间后保持打开状态 当要发送数据时调用Close方法。没有 底层连接完成时提供的通知 闭。
调用此方法最终将导致关联的Socket关闭,并且还将关闭用于发送和接收数据的相关NetworkStream(如果已创建)。
答案 2 :(得分:20)
使用字词:using
。编程的好习惯。
using (TcpClient tcpClient = new TcpClient())
{
//operations
tcpClient.Close();
}
答案 3 :(得分:7)
关闭套接字连接并允许重新使用套接字:
tcpClient.Client.Disconnect(false);
答案 4 :(得分:4)
除了一些内部日志记录,请关闭== Dispose。
处理调用tcpClient.Client.Shutdown(SocketShutdown.Both),但它会吃掉任何错误。 也许如果你直接调用它,你可以获得一些有用的异常信息。
答案 5 :(得分:4)
答案 6 :(得分:3)
尽管有所有适当的using
语句,调用Close
,有一些指数退避逻辑并重新创建TcpClient
我仍然看到应用程序无法恢复TCP的问题没有重启应用程序的连接。它一直在失败
System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host
。
但是LingerState
上有一个选项TcpClient
似乎已经解决了这个问题(可能几个月后就不知道,因为我自己的硬件设置只会经常失败!)。见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 })
...
答案 7 :(得分:0)
您是否尝试过明确调用TcpClient.Dispose()?
你确定你有TcpClient.Close()和TcpClient.Dispose() - ed 所有连接吗?