如何在Golang中将网络客户端的IP转换为字符串?

Bar*_*rim 4 string network-programming go

我正在尝试在与服务器建立连接时获取客户端IP.尝试使用RemoteAddr()返回一个addr类型,虽然我可以使用打印到控制台fmt.Println,我正在尝试将值赋给字符串变量.

这可能吗?或者有更好的方法来提取连接客户端的IP地址吗?

我正在处理的函数示例(strRemoteAddr赋值是问题部分,但我将其作为占位符保留...):

func GrabInput(conn net.Conn, strFromListenerNumber string) {
    var strMessage string
    var strRemoteAddr string

    bufIncoming := make([]byte, 1024)

    strRemoteAddr = conn.RemoteAddr()

    for {
        bytesRead, err := conn.Read(bufIncoming)
        if err != nil {
            LogEvent(strFromListenerNumber, err.Error())
            return
        }

        strMessage = string(bufIncoming[0 : bytesRead-1])
        LogEvent(strFromListenerNumber+": "+strRemoteAddr, strMessage)
    }
}
Run Code Online (Sandbox Code Playgroud)

Uve*_*tel 14

似乎只是

strRemoteAddr = conn.RemoteAddr().String()
Run Code Online (Sandbox Code Playgroud)

可以这样做,net.Addr类型有字符串表示的方法String().

  • 这不会将IP作为字符串返回(仅)。它还将包括传入端口,如果RemoteAddr()为IPv6,输出将更加混乱。 (4认同)
  • RemoteAddr()返回接口net.Addr,具体取决于实现,对String()的调用几乎总是返回比ip多的值,它还包括端口。@mileusna的答案是找到IP的正确方法。如果您的net.Conn可以是TCPAddr以外的其他类型(例如UDPAddr,UnixAddr),则可能需要添加更多检查。并非所有地址都包含IP。 (2认同)

mil*_*sna 14

将其转换为 *net.TCPAddr

if addr, ok := conn.RemoteAddr().(*net.TCPAddr); ok {
    fmt.Println(addr.IP.String())
}
Run Code Online (Sandbox Code Playgroud)