Go で HTTP 応答の基になるソケットにアクセスするにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-04 22:39:02
オリジナル
588 人が閲覧しました

How Can I Access the Underlying Socket of an HTTP Response in Go?

HTTP 応答の基になるソケットへのアクセス

Go では、HTTP の基になるソケットにアクセスする必要がある状況に遭遇することがあります。応答。通常、TCP_INFO などのプラットフォーム固有の操作をソケット上で実行する場合は、ソケットへのアクセスが必要です。 HTTP 応答からソケットを直接取得する簡単な方法はありませんが、検討できる方法がいくつかあります。

1.コンテキスト キーの使用 (Go 1.13 ):
Go 1.13 がリリースされたら、リクエスト コンテキストへの net.Conn の保存がサポートされる予定です。これは、クリーンで簡単なメソッドを提供します。

<code class="go">package main

import (
  "net/http"
  "context"
  "net"
  "log"
)

type contextKey struct {
  key string
}
var ConnContextKey = &contextKey{"http-conn"}

func SaveConnInContext(ctx context.Context, c net.Conn) (context.Context) {
  return context.WithValue(ctx, ConnContextKey, c)
}

func GetConn(r *http.Request) (net.Conn) {
  return r.Context().Value(ConnContextKey).(net.Conn)
}

func main() {
  http.HandleFunc("/", myHandler)
  server := http.Server{
    Addr: ":8080",
    ConnContext: SaveConnInContext,
  }
  server.ListenAndServe()
}

func myHandler(w http.ResponseWriter, r *http.Request) {
  conn := GetConn(r)
  ...
}</code>
ログイン後にコピー

2.リモート アドレス (TCP) による接続のマッピング:
TCP をリッスンするサーバーの場合、各接続には一意の net.Conn.RemoteAddr().String() 値があります。この値は、接続のグローバル マップへのキーとして使用できます:

<code class="go">package main

import (
  "net/http"
  "net"
  "fmt"
  "log"
)

var conns = make(map[string]net.Conn)

func ConnStateEvent(conn net.Conn, event http.ConnState) {
  if event == http.StateActive {
    conns[conn.RemoteAddr().String()] = conn
  } else if event == http.StateHijacked || event == http.StateClosed {
    delete(conns, conn.RemoteAddr().String())
  }
}

func GetConn(r *http.Request) (net.Conn) {
  return conns[r.RemoteAddr]
}

func main() {
  http.HandleFunc("/", myHandler)
  server := http.Server{
    Addr: ":8080",
    ConnState: ConnStateEvent,
  }
  server.ListenAndServe()
}

func myHandler(w http.ResponseWriter, r *http.Request) {
  conn := GetConn(r)
  ...
}</code>
ログイン後にコピー

3。 UNIX ソケットのリモート アドレスの上書き:
UNIX ソケットの場合、net.Conn.RemoteAddr().String() は常に "@" を返すため、マッピングには適していません。これを解決するには:

  • net.Listener.Accept() をオーバーライドします
  • そのオーバーライドを使用して、net.UnixConn.File()

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!