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() は常に "@" を返すため、マッピングには適していません。これを解決するには:
以上がGo で HTTP 応答の基になるソケットにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。