有个通过代理进来的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())
}