首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确且完全关闭/重置TcpClient连接?

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

Stack Overflow用户
提问于 2009-01-08 17:55:24
回答 5查看 122.8K关注 0票数 84

关闭或重置TcpClient连接的正确方法是什么?我们有与硬件通信的软件,但有时会出现问题,我们不能再与它通信,直到我们重新启动软件。

我尝试强制使用TcpClient.Close(),甚至将其设置为null,但都不起作用。只有完全重启软件才能正常工作。

有什么建议吗?

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

它是一个处理通信的库。软件本身可以调用控制器类(表示硬件)的ResetConnection()方法。

它目前看起来像

代码语言:javascript
运行
复制
if (tcpClient != null)
{
    tcpClient.Close();
    tcpClient = null;
}

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

我会试一试,看看会不会有什么不同。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-30 22:44:49

在关闭连接之前,必须先关闭流:

代码语言:javascript
运行
复制
tcpClient.GetStream().Close();
tcpClient.Close();

关闭客户端不会关闭流。

票数 98
EN

Stack Overflow用户

发布于 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

代码语言:javascript
运行
复制
// 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 })
   ...
票数 11
EN

Stack Overflow用户

发布于 2009-01-09 14:35:40

除了一些内部日志记录之外,关闭== Dispose。

Dispose调用tcpClient.Client.Shutdown( SocketShutdown.Both ),但它会吃掉任何错误。也许如果你直接调用它,你可以得到一些有用的异常信息。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/425235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档