首頁  >  文章  >  後端開發  >  如何在 Go 中存取 net/http 回應的底層套接字?

如何在 Go 中存取 net/http 回應的底層套接字?

Linda Hamilton
Linda Hamilton原創
2024-11-06 16:15:02438瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn