如何在Go中获取客户端IPv4地址?

时间:2015-09-12 11:08:19

标签: go

我正在尝试编写一个返回客户端IPv4地址的函数。

我从http.Request.RemoteAddr获取字符串,并使用net.SplitHostPort过滤掉ip。这给了我:: 1,因为我在localhost上,我认为它应该是一个IPv6地址?

然后我ip := net.ParseIP(s)然后ip = ip.To4()获取IPv4地址。

我在Windows上并在我的主机文件中有这个:(其余的已注释掉。)

127.0.0.1 localhost localhost.com www.localhost.com *.localhost.com

基本上我希望得到127.0.0.1,但我无法得到它。

这是代码:

func FilterIpv4(r *http.Request) (string, error) {
    var s string
    // if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
    //  ip = xff
    // }
    s, _, err := net.SplitHostPort(r.RemoteAddr)
    if err != nil {
        return "", err
    }
    ip := net.ParseIP(s)
    ip = ip.To4()
    spew.Dump(ip.String()) // outputs "<nil>"
    return "", nil

}

编辑:

我不知道这样做是否是一个好主意但至少我现在得到了ipv4地址。也许我应该坚持使用ipv6?我不知道这个。但是替换这段代码:

log.Fatal(http.ListenAndServe(":"+config.SrvPort, router))

有了这个:

ln, err := net.Listen("tcp4", ":"+config.SrvPort)
if err != nil {
    log.Fatal(err)
}
log.Fatal(http.Serve(ln, router))

让我可以获得ipv4地址。

有人知道这一般是不是一个好主意?或者我应该坚持使用ipv6地址?

编辑2:

我最终得到了这个功能:

func FilterIP(r *http.Request) (string, error) {
    var ip string
    var err error
    if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
        ips := strings.Split(xff, ", ")
        ip = ips[0]
    } else {
        ip, _, err = net.SplitHostPort(r.RemoteAddr)
        if err != nil {
            return "", err
        }
    }
    if !IsIP(ip) {
        return "", err
    }
    return ip, nil
}

我将保存ipv6和ipv4地址。

0 个答案:

没有答案