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