golang 獲取tcp連接的文件描述符fd

有個(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())
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。