Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengakses Soket Dasar Tindak Balas net/http dalam Go?

Bagaimana untuk Mengakses Soket Dasar Tindak Balas net/http dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-11-06 16:15:02516semak imbas

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

Mengakses Soket Dasar Tindak Balas net/http dalam Go

Pengenalan

Semasa membangunkan aplikasi web menggunakan pakej net/http Go, mungkin perlu mengakses soket asas yang dikaitkan dengan HTTP tindak balas. Ini membenarkan pelaksanaan operasi khusus platform tambahan pada soket, seperti panggilan sistem TCP_INFO.

Penyelesaian

Menggunakan Konteks Permintaan (Go 1.13 dan kemudian)

Dalam Go 1.13 dan kemudian, net.Conn objek boleh disimpan dalam Konteks Permintaan, membolehkan akses mudah dalam fungsi pengendali.

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

Menggunakan RemoteAddr dan Peta Sambungan (Pre-Go 1.13)

Untuk pelayan mendengar pada port TCP, kunci unik boleh dijana daripada RemoteAddr setiap sambungan menggunakan global peta.

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

Mengatasi RemoteAddr untuk Soket UNIX

Untuk pelayan mendengar pada soket UNIX, RemoteAddr sentiasa "@", menjadikan pendekatan sebelumnya tidak berkesan. Untuk menyelesaikan masalah ini, ganti net.Listener.Accept() dan takrifkan semula kaedah RemoteAddr().

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

Nota Tambahan

  • The Hijack() kaedah membenarkan kawalan sepenuhnya ke atas soket TCP mentah, tetapi ia adalah pendekatan yang lebih invasif.
  • The Panggilan balik ConnStateEvent boleh digunakan untuk menjejaki keadaan sambungan dan mengemas kini peta sambungan dengan sewajarnya.

Atas ialah kandungan terperinci Bagaimana untuk Mengakses Soket Dasar Tindak Balas net/http dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn