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
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!