Maison  >  Article  >  développement back-end  >  Comment accéder au socket sous-jacent d’une réponse net/http dans Go ?

Comment accéder au socket sous-jacent d’une réponse net/http dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-06 16:15:02438parcourir

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

Accès au socket sous-jacent d'une réponse net/http dans Go

Introduction

Pendant En développant une application Web à l'aide du package net/http de Go, il peut être nécessaire d'accéder au socket sous-jacent associé à une réponse HTTP. Cela permet l'exécution d'opérations supplémentaires spécifiques à la plate-forme sur le socket, telles que les appels système TCP_INFO.

Solutions

Utilisation du contexte de requête (Go 1.13 et plus tard)

Dans Go 1.13 et versions ultérieures, l'objet net.Conn peut être stocké dans le Request Contexte, permettant un accès facile au sein de la fonction de gestionnaire.

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

Utilisation de RemoteAddr et de Connections Map (Pre-Go 1.13)

Pour les serveurs écoutant sur les ports TCP, un une clé unique peut être générée à partir du RemoteAddr de chaque connexion à l'aide d'une carte globale.

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

Remplacement RemoteAddr pour UNIX Socket

Pour les serveurs écoutant sur des sockets UNIX, le RemoteAddr est toujours "@", rendant l'approche précédente inefficace. Pour résoudre ce problème, remplacez net.Listener.Accept() et redéfinissez la méthode RemoteAddr().

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

Notes supplémentaires

  • The Hijack() La méthode permet un contrôle complet sur le socket TCP brut, mais il s'agit d'une approche plus invasive.
  • Le rappel ConnStateEvent peut être utilisé pour suivre l'état des connexions et mettre à jour la carte de connexion en conséquence.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn