golang 获取tcp连接的文件描述符fd

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

你可能感兴趣的:(golang 获取tcp连接的文件描述符fd)