>  기사  >  백엔드 개발  >  Go에서 net/http 응답의 기본 소켓에 액세스하는 방법은 무엇입니까?

Go에서 net/http 응답의 기본 소켓에 액세스하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-06 16:15:02436검색

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

Go에서 net/http 응답의 기본 소켓 액세스

소개

중 Go의 net/http 패키지를 사용하여 웹 애플리케이션을 개발하려면 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 및 연결 맵 사용(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.