Heim  >  Artikel  >  Backend-Entwicklung  >  Wie greife ich in Go auf den zugrunde liegenden Socket einer Netz-/http-Antwort zu?

Wie greife ich in Go auf den zugrunde liegenden Socket einer Netz-/http-Antwort zu?

Linda Hamilton
Linda HamiltonOriginal
2024-11-06 16:15:02438Durchsuche

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

Zugriff auf den zugrunde liegenden Socket einer Netz-/http-Antwort in Go

Einführung

While Beim Entwickeln einer Webanwendung mit dem Net/http-Paket von Go kann es erforderlich sein, auf den zugrunde liegenden Socket zuzugreifen, der einer HTTP-Antwort zugeordnet ist. Dies ermöglicht die Ausführung zusätzlicher plattformspezifischer Vorgänge auf dem Socket, wie z. B. TCP_INFO-Systemaufrufe.

Lösungen

Verwenden des Anforderungskontexts (Go 1.13 und später)

In Go 1.13 und höher kann das net.Conn-Objekt im Request-Kontext gespeichert werden, was einen einfachen Zugriff innerhalb der Handler-Funktion ermöglicht.

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

Verwendung von RemoteAddr und Connections Map (Pre-Go 1.13)

Für Server, die TCP-Ports überwachen, kann mithilfe einer globalen Map ein eindeutiger Schlüssel aus der RemoteAddr jeder Verbindung generiert werden.

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

RemoteAddr für UNIX-Sockets überschreiben

Für Server, die auf UNIX-Sockets lauschen, ist RemoteAddr immer „@“, wodurch der vorherige Ansatz unwirksam wird. Um dieses Problem zu beheben, überschreiben Sie net.Listener.Accept() und definieren Sie die RemoteAddr()-Methode neu.

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

Zusätzliche Hinweise

  • The Hijack() Die Methode ermöglicht die vollständige Kontrolle über den rohen TCP-Socket, ist jedoch ein invasiverer Ansatz.
  • Der ConnStateEvent-Rückruf kann verwendet werden, um den Status von Verbindungen zu verfolgen und die Verbindungszuordnung entsprechend zu aktualisieren.

Das obige ist der detaillierte Inhalt vonWie greife ich in Go auf den zugrunde liegenden Socket einer Netz-/http-Antwort zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn