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

Wie greife ich auf den zugrunde liegenden Socket in der Net/http-Antwort von Go zu?

Barbara Streisand
Barbara StreisandOriginal
2024-11-04 12:42:29724Durchsuche

How Do I Access the Underlying Socket in Go's net/http Response?

Erhalten des zugrunde liegenden Sockets in der net/http-Antwort von Go

Das net/http-Paket von Go bietet ein praktisches Framework zum Erstellen von HTTP-Servern. Es kann jedoch Situationen geben, in denen Sie Zugriff auf den zugrunde liegenden Socket des Antwortstreams benötigen. Dieser Artikel geht auf diesen Bedarf ein, indem er verschiedene Ansätze zum Abrufen der Socket-Verbindung untersucht.

Vor Go 1.13

Vor Go 1.13 waren zum Abrufen des zugrunde liegenden Sockets aufwändigere Techniken erforderlich. Hier sind zwei Ansätze:

  1. Ereignisbasiertes Tracking (nur TCP-Verbindungen):
    Für Verbindungen über TCP-Ports können Sie den net.Listener nutzen. ConnState-Ereignishandler zum Verfolgen aktiver Verbindungen und der zugehörigen Sockets. Diese Informationen können zum späteren Abruf in einer globalen Karte gespeichert werden.

    <code class="go">var conns = make(map[string]net.Conn)
    
    func ConnStateEvent(conn net.Conn, event http.ConnState) {
      if event == http.StateActive {
        conns[conn.RemoteAddr().String()] = conn
      } else if event == http.StateHijacked || event == http.StateClosed {
        delete(conns, conn.RemoteAddr().String())
      }
    }
    
    func GetConn(r *http.Request) (net.Conn) {
      return conns[r.RemoteAddr]
    }</code>
  2. Listener-Überschreibung (Unix-Sockets):
    Unix-Sockets erfordern eine komplexere Vorgehensweise Ansatz, da ihnen eindeutige Kennungen für jede Verbindung fehlen. Eine Lösung besteht darin, die Methode net.Listener.Accept zu überschreiben, um jeder Verbindung eindeutige Zeichenfolgen zuzuweisen und diese als Schlüssel zum Speichern von Socket-Informationen zu verwenden.

    <code class="go">func NewConnSaveListener(wrap net.Listener) (net.Listener) {
      return connSaveListener{wrap}
    }
    
    func (self connSaveListener) Accept() (net.Conn, error) {
      conn, err := self.Listener.Accept()
      ptrStr := fmt.Sprintf("%d", &conn)
      conns[ptrStr] = conn
      return remoteAddrPtrConn{conn, ptrStr}, err
    }
    
    func GetConn(r *http.Request) (net.Conn) {
      return conns[r.RemoteAddr]
    }</code>

Go 1.13 und Darüber hinaus

Mit der Veröffentlichung von Go 1.13 ist eine einfachere Lösung verfügbar:

  1. Kontextbasierter Speicher:
    Ab Go 1.13 kann net.Conn im Kontext der HTTP-Anfrage gespeichert werden. Dies bietet eine saubere und effiziente Möglichkeit, auf die Socket-Verbindung zuzugreifen.

    <code class="go">type contextKey struct {
      key string
    }
    var ConnContextKey = &contextKey{"http-conn"}
    
    func SaveConnInContext(ctx context.Context, c net.Conn) (context.Context) {
      return context.WithValue(ctx, ConnContextKey, c)
    }
    
    func GetConn(r *http.Request) (net.Conn) {
      return r.Context().Value(ConnContextKey).(net.Conn)
    }</code>

Durch das Verständnis dieser Techniken können Sie den zugrunde liegenden Socket in Ihren Net/HTTP-Antwort-Handlern effektiv abrufen und so benutzerdefinierte ermöglichen Operationen und plattformspezifische Funktionalität.

Das obige ist der detaillierte Inhalt vonWie greife ich auf den zugrunde liegenden Socket in der Net/http-Antwort von Go 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