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

Barbara Streisand
Freigeben: 2024-11-04 12:42:29
Original
674 Leute haben es durchsucht

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>
    Nach dem Login kopieren
  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>
    Nach dem Login kopieren

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>
    Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!