ホームページ  >  記事  >  バックエンド開発  >  Go で net/http 応答の基になるソケットにアクセスする方法は?

Go で net/http 応答の基になるソケットにアクセスする方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-06 16:15:02438ブラウズ

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

Go での net/http レスポンスの基になるソケットへのアクセス

はじめに

Go の net/http パッケージを使用して Web アプリケーションを開発する場合、HTTP 応答に関連付けられた基盤となるソケットにアクセスすることが必要になる場合があります。これにより、TCP_INFO システム コールなど、ソケット上で追加のプラットフォーム固有の操作を実行できるようになります。

ソリューション

リクエスト コンテキストの使用 (Go 1.13 および後で)

Go 1.13 以降では、net.Conn オブジェクトをリクエスト コンテキストに保存できるため、ハンドラー関数内で簡単にアクセスできます。

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

RemoteAddr と接続マップの使用 (Pre-Go 1.13)

TCP ポートでリッスンしているサーバーの場合、グローバル マップを使用して各接続の RemoteAddr から一意のキーを生成できます。

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

UNIX ソケットの RemoteAddr をオーバーライドする

UNIX ソケットでリッスンするサーバーの場合、RemoteAddr は常に "@" であるため、前のアプローチは無効になります。これを解決するには、net.Listener.Accept() をオーバーライドし、RemoteAddr() メソッドを再定義します。

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

補足

  • The Hijack()このメソッドを使用すると、生の TCP ソケットを完全に制御できますが、より侵襲的なアプローチになります。
  • ConnStateEvent コールバックを使用して、接続の状態を追跡し、それに応じて接続マップを更新できます。

以上がGo で net/http 応答の基になるソケットにアクセスする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。