首页 > 后端开发 > Golang > 正文

如何在 Go 中访问 net/http 响应的底层套接字?

Linda Hamilton
发布: 2024-11-06 16:15:02
原创
513 人浏览过

How to Access the Underlying Socket of a net/http Response in Go?

在 Go 中访问 net/http 响应的底层套接字

简介

虽然使用 Go 的 net/http 包开发 Web 应用程序时,可能需要访问与 HTTP 响应关联的底层套接字。这允许在套接字上执行其他特定于平台的操作,例如 TCP_INFO 系统调用。

解决方案

使用请求上下文(Go 1.13 和稍后)

在 Go 1.13 及更高版本中,net.Conn 对象可以存储在请求上下文中,从而可以在处理程序函数中轻松访问。

<code class="go">func GetConn(r *http.Request) (net.Conn) {
  return r.Context().Value(ConnContextKey).(net.Conn)
}</code>
登录后复制

使用 RemoteAddr 和连接映射(Go 1.13 之前的版本)

对于侦听 TCP 端口的服务器,可以使用全局映射从每个连接的 RemoteAddr 生成唯一密钥。

<code class="go">func GetConn(r *http.Request) (net.Conn) {
  return conns[r.RemoteAddr]
}</code>
登录后复制

覆盖 UNIX 套接字的 RemoteAddr

对于在 UNIX 套接字上侦听的服务器,RemoteAddr 始终为“@”,这使得之前的方法无效。要解决此问题,请重写 net.Listener.Accept() 并重新定义 RemoteAddr() 方法。

<code class="go">type remoteAddrPtrConn struct {
  net.Conn
  ptrStr string
}
func (self remoteAddrPtrConn) RemoteAddr() (net.Addr) {
  return remoteAddrPtr{self.ptrStr}
}</code>
登录后复制

附加说明

  • 劫持()方法允许完全控制原始 TCP 套接字,但它是一种更具侵入性的方法。
  • ConnStateEvent 回调可用于跟踪连接状态并相应地更新连接映射。

以上是如何在 Go 中访问 net/http 响应的底层套接字?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板