关闭或重置TcpClient连接的正确方法是什么?我们有软件与硬件通信,但有时出现问题,我们不再与它通信,直到我们重新启动软件.
我已经尝试强制TcpClient.Close(),甚至将其设置为null但这不起作用.只有完全重启软件才能运行.
建议?
我不能使用using关键字,因为TpcClient仅在一个位置定义,但在整个库中使用.(并且在任何给定时间只有一个连接)
它是一个处理通信的库.软件本身可以调用Controller类的ResetConnection()方法(代表硬件).
它目前看起来像
if (tcpClient != null) { tcpClient.Close(); tcpClient = null; }
现在从我在这里读到的,我应该使用tcpClient.Dispose()而不是"= null"
我会尝试一下,看看它是否有所作为.
您必须在关闭连接之前关闭流:
tcpClient.GetStream().Close(); tcpClient.Close();
关闭客户端不会关闭流.
用词:using
.编程的好习惯.
using (TcpClient tcpClient = new TcpClient()) { //operations tcpClient.Close(); }
鉴于接受的答案已经过时,我在其他答案中没有看到任何关于此的答案,我正在创建一个新答案.在.Net 2和更早版本中,您必须在关闭连接之前手动关闭流.该错误TcpClient
在C#的所有更高版本中得到修复,并且如Close方法的文档中所述,对方法的调用会Close
关闭连接和流
编辑根据Microsoft Docs
Close方法将实例标记为已释放,并请求关联的Socket关闭TCP连接.基于LingerState属性,在仍需要发送数据时调用Close方法后,TCP连接可能会保持打开一段时间.底层连接完成关闭时没有提供通知.
调用此方法最终将导致关联的Socket关闭,并且还将关闭用于发送和接收数据的关联NetworkStream(如果已创建).
关闭套接字连接并允许重新使用套接字:
tcpClient.Client.Disconnect(false);
除某些内部日志记录外,关闭==处置。
处置调用tcpClient.Client.Shutdown(SocketShutdown.Both),但是会占用任何错误。也许如果直接调用它,可以获得一些有用的异常信息。
关闭套接字以便重新打开的正确方法是:
tcpClient.Client.Disconnect(true);
Boolean参数指示是否要重用套接字:
尽管拥有所有适当的using
语句,但调用Close
,具有一些指数退避逻辑并重新创建TcpClient
I,我仍然看到问题,即如果应用程序不重新启动,应用程序将无法恢复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 }) ...