当前位置: 首页 > 面试题库 >

如何知道网络封装中TCP连接是关闭的?

訾高明
2023-03-14
问题内容

我正在实现一个小型TCP服务器。我怎么知道我的一位客户是否关门?我应该只是尝试读取或写入并检查是否err为零?


问题答案:

该线程“
的最佳方式可靠地检测TCP连接被关闭 ”,使用net.Conn了“
c”(也可见于utils/ping.golocale- backend/server.go或许多其他情况下):

one := make([]byte, 1)
c.SetReadDeadline(time.Now())
if _, err := c.Read(one); err == io.EOF {
  l.Printf(logger.LevelDebug, "%s detected closed LAN connection", id)
  c.Close()
  c = nil
} else {
  var zero time.Time
  c.SetReadDeadline(time.Now().Add(10 * time.Millisecond))
}

为了检测超时,建议:

if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
  ...

更新2019:tuxedo25在评论中提到:

在Go 1.7+中,零字节读取立即返回,并且永远不会返回错误。
您必须读取至少一个字节。

参见commit5bcdd63并执行issue
15735

net:不要io.EOF从零字节读取中返回



 类似资料:
  • 此问题仅适用于HTTPS请求。 让我们将问题分为 3 个方面。 起源。这是用户发送HTTPS请求 代理。这将处理请求,将其转发到远程设备,反之亦然 遥控器。这是请求应该到达的服务器 当您通过代理发出HTTPS请求时,会发生以下情况: > Origin使用HTTP发送(未加密): CONNECT remote.url:443 HTTP/1.1 ... 代理回复: HTTP/1.1 200连接已建立

  • 提前致谢

  • 问题内容: 我正在使用以下代码从Go应用执行SET和EXPIRE。 但我开始出现错误: 使用封闭的网络连接 。我使用Gary Burd的Redigo软件包和RedisLabs。 我连接到Redis的代码是: 问题答案: 您可以使用来管理多个连接,检查空闲连接是否仍在运行,并自动获取新连接。您也可以在拨打新连接时自动执行AUTH步骤:

  • 我正在实现一个TCP堆栈,并且遇到了半关闭连接的问题。 我的实现充当服务器端。客户端建立连接,然后发送一些数据,然后发送“FIN”消息。然后,服务器确认来自客户端的数据,发送自己的一些数据,然后才关闭其一半的连接(发送“FIN”)。 问题是,客户端没有确认服务器在半封闭连接上发送的数据,也没有确认其最终的“FIN”消息。根据netstat,客户端处于FIN_WAIT2状态。在服务器不发送任何数据的

  • 我使用来管理服务器端的套接字连接。如果服务器(tomcat)关闭,我如何确保任何活动的套接字连接被正确终止? 有好心的听众吗?或任何可以防止服务器关闭的拦截器,例如,如果在关闭期间有任何打开的套接字,则最多60秒;但同时关闭套接字,在关机期间不接受任何连接?

  • 关闭网络浏览接口 启动网络浏览接口时按下按钮。会自动切断与网络的联机。 提示 亦可从选单列中选择[档案] > [关闭网页]。