golang getpeername

发布时间:2024-12-23 03:40:30

使用golang的getpeername函数获取对方地址

在网络编程中,有时我们需要获取对方的IP地址和端口号。使用Golang编程时,可以使用getpeername函数来实现这个功能。本文将介绍如何使用golang的getpeername函数获取对方地址。

什么是getpeername函数

getpeername函数是一个套接字操作函数,用于获取连接到本地套接字的远程(对方)地址。它接受一个文件描述符作为参数,返回对方的IP地址和端口号。

使用方法

要使用getpeername函数,首先需要导入网络编程的包:


import (
    "net"
    "syscall"
)

然后,可以通过获取连接的TCP套接字,使用getpeername函数获取对方地址:


func GetPeerAddr(conn net.Conn) (remoteIP net.IP, remotePort uint16, err error) {
    tcpConn, ok := conn.(*net.TCPConn)
    if !ok {
        return nil, 0, fmt.Errorf("conn is not a TCPConn")
    }

    fd, err := tcpConn.File()
    if err != nil {
        return nil, 0, fmt.Errorf("failed to get file descriptor: %v", err)
    }
    defer fd.Close()

    tcpFd := fd.Fd()
    var addr syscall.Sockaddr
    addr, err = syscall.Getpeername(int(tcpFd))
    if err != nil {
        return nil, 0, fmt.Errorf("failed to get peer name: %v", err)
    }

    switch addr := addr.(type) {
    case *syscall.SockaddrInet4:
        remoteIP = net.IPv4(addr.Addr[0], addr.Addr[1], addr.Addr[2], addr.Addr[3])
        remotePort = uint16(addr.Port)
    case *syscall.SockaddrInet6:
        remoteIP = addr.Addr[:]
        remotePort = uint16(addr.Port)
    default:
        return nil, 0, fmt.Errorf("unknown address type")
    }

    return remoteIP, remotePort, nil
}

在上面的代码中,我们首先将net.Conn类型的连接转换为TCPConn类型的连接。然后,通过将TCPConn的文件描述符转换为文件,可以获取文件描述符的整数值。接下来,我们将文件描述符传递给getpeername函数,并将返回的地址数据类型转换为syscall.SockaddrInet4或syscall.SockaddrInet6类型。根据地址类型,我们获取对方的IP地址和端口号并返回。

示例

下面是一个使用getpeername函数的示例程序:


package main

import (
    "fmt"
    "net"
)

func main() {
    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("Error starting server:", err)
        return
    }
    defer listener.Close()

    fmt.Println("Server started on :8080")

    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Error accepting connection:", err)
            return
        }

        remoteIP, remotePort, err := GetPeerAddr(conn)
        if err != nil {
            fmt.Println("Error getting remote address:", err)
            return
        }

        fmt.Printf("Received connection from %s:%d\n", remoteIP.String(), remotePort)

        conn.Close()
    }
}

在这个示例程序中,我们启动了一个TCP服务器并监听8080端口。当有新的连接到达时,我们使用getpeername函数获取对方的地址,并打印出来。

总结

在本文中,我们介绍了如何使用golang的getpeername函数来获取对方的IP地址和端口号。通过使用getpeername函数,我们可以方便地获取网络连接的对方地址,以便进行进一步的处理。希望本文能帮助你更好地理解和使用getpeername函数。

相关推荐