有個(gè)通過(guò)代理進(jìn)來(lái)的tcp連接,通過(guò)Conn.RemoteAddr獲取到的是代理點(diǎn)的ip地址,為了獲取實(shí)際客戶端的ip,找到了syscall.Getpeername的方法,而這個(gè)方法需要的是連接的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())
}