有個通過代理進來的tcp連接,通過Conn.RemoteAddr獲取到的是代理點的ip地址视搏,為了獲取實際客戶端的ip蔚约,找到了syscall.Getpeername的方法,而這個方法需要的是連接的fd瓤介。
l, err := net.Listen("tcp", ":9091")
handleErr(err)
conn, err := l.Accept()
handleErr(err)
if s, ok := conn.(*net.TCPConn); !ok {
handleErr(errors.New("not tcp conn"))
} else {
f, err := s.File()
handleErr(err)
sa, err := syscall.Getpeername(int(f.Fd()))
handleErr(err)
ip := sa.(*syscall.SockaddrInet6).Addr
port := sa.(*syscall.SockaddrInet6).Port
fmt.Println(ip, port, conn.RemoteAddr().String())
}