linux - Golang 在关闭后保持文件服务套接字打开

标签 linux macos sockets go

我在 golang 中创建了一个文件服务器,并在 Listener 上调用了 Close() 方法。

当我尝试访问新 Web 连接上的端口时,套接字似乎已关闭,我无法访问该网站。

如果我用已经建立的连接引用页面怎么办....页面重新加载很好,就好像套接字从未关闭过一样?我什至还能浏览文件系统。

我注意到大约 30 分钟后套接字似乎强制关闭。

我是否缺少强制套接字丢弃所有现有连接以防止人们访问文件服务器的东西?

var fileListener net.Listener
host_string = "127.0.0.1:8080"
fileListener, _ = net.Listen("tcp", host_string)
server := &http.Server{Addr: host_string, Handler:     
http.FileServer(http.Dir("/"))}
go func() { server.Serve(fileListener) }()
fileListener.Close()

最佳答案

没有办法关闭空闲的 HTTP/1.1 或 HTTP2 连接。 https://golang.org/issue/9478 上有一个 Unresolved 问题,但没有立即计划。请注意,一旦您关闭监听器,您的服务器将不会接受新连接;您正在重用相同的连接。

如果你想强行关闭所有连接,你需要自己使用 http.Server 进行簿记。 ConnState 跟踪事件的 TCP 连接。

您也可以让您的处理程序在每个响应上设置 Connection: close,但是如果客户端需要发出超过 1 个请求,这会使您的 http 服务器效率大大降低。

关于linux - Golang 在关闭后保持文件服务套接字打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37979111/

相关文章:

c - 复制文件时删除了笔式驱动器

c++ - Linux 中编译的程序未检测到 fstream 中的 '\n' 换行符,而 Windows 运行时会检测到

macos - 在 Mac OSX 上安装 SQLite - 或者,是否有推荐的备用数据库?

c - 原始 TCP 套接字在发送初始数据后接收恒定的 PSH、ACK 数据包

sockets - 来自特定网卡的 UDP 组播

linux - 有没有办法在保留分支名称的同时通过提交哈希使用 "git log --oneline"过滤?

mysql - Excel Mac 2016,在 VBA 函数内调用时 ListObject 不起作用

ruby-on-rails - 如何在 Mac OSX 上安装 PCRE 开发头文件

c++ - 服务器和多个客户端使用 pthreads 和 select()

Linux读取日志文件并过滤以仅获取一次相同类型的日志消息