如何正确完全关闭/重置TcpClient连接?

时间:2009-01-08 17:55:24

标签: c# .net tcp

关闭或重置TcpClient连接的正确方法是什么? 我们有软件可以与硬件进行通信但有时会有些东西 出错了,我们不再与之沟通,直到我们重新启动软件。

我尝试强制使用TcpClient.Close(),甚至将其设置为null但这不起作用。 只需完全重启软件即可。

建议?


我无法使用using关键字,因为TpcClient仅在一个位置定义,但在整个库中使用。 (并且在任何给定时间只有一个连接)

这是一个处理通信的库。软件本身可以调用Controller类的ResetConnection()方法(代表硬件)。

目前看起来像

if (tcpClient != null)
{
    tcpClient.Close();
    tcpClient = null;
}

现在从我在这里读到的,我应该使用tcpClient.Dispose()而不是“= null”

我会尝试一下,看看它是否有所作为。

8 个答案:

答案 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)

关闭套接字以便重新打开的正确方法是:

tcpClient.Client.Disconnect(true);

Boolean参数指示您是否要重用套接字:

Disconnect method usage

答案 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 所有连接吗?