{"id":4146,"date":"2018-10-29T08:13:59","date_gmt":"2018-10-29T00:13:59","guid":{"rendered":"https:\/\/ixyzero.com\/blog\/?p=4146"},"modified":"2018-10-29T08:13:59","modified_gmt":"2018-10-29T00:13:59","slug":"go%e8%af%ad%e8%a8%80%e5%ad%a6%e4%b9%a09-%e5%a6%82%e4%bd%95%e6%93%8d%e4%bd%9cip%e5%9c%b0%e5%9d%80","status":"publish","type":"post","link":"https:\/\/ixyzero.com\/blog\/archives\/4146.html","title":{"rendered":"Go\u8bed\u8a00\u5b66\u4e60#9-\u5982\u4f55\u64cd\u4f5cIP\u5730\u5740"},"content":{"rendered":"<p>=Start=<\/p>\n<h4 id=\"id-\u6a21\u677f-\u7f18\u7531\uff1a\">\u7f18\u7531\uff1a<\/h4>\n<p>\u4e4b\u524d\u5728\u535a\u5ba2\u4e2d\u8bb0\u5f55\u8fc7\u7528Python\u5904\u7406\u8fc7IP\u5730\u5740\u76f8\u5173\u7684\u64cd\u4f5c\uff0c\u6bd4\u5982\u300c<a href=\"https:\/\/ixyzero.com\/blog\/archives\/3908.html\" target=\"_blank\" rel=\"noopener\">Python\u4e2d\u5982\u4f55\u83b7\u53d6\u5f53\u524d\u673a\u5668\u7684IP\u5730\u5740<\/a>\u300d\u548c\u300c<a href=\"https:\/\/ixyzero.com\/blog\/archives\/2707.html\" target=\"_blank\" rel=\"noopener\">Python\u7684netaddr\u6a21\u5757\u4f7f\u7528\u8bb0\u5f55<\/a>\u300d\uff1b\u8fd8\u6709Java\u7248\u672c\u7684\u300c<a href=\"https:\/\/ixyzero.com\/blog\/archives\/3853.html\">Java\u4e2d\u5982\u4f55\u5224\u65ad\u4e00\u4e2aIP\u662f\u5426\u5728\u4e00\u4e2a\u7f51\u6bb5\u91cc\u9762\uff1f<\/a>\u300d\u3002\u8fd9\u91cc\u8bb0\u5f55\u4e00\u4e0b\u5982\u4f55\u7528Go \u8bed\u8a00\u8fdb\u884c\u5904\u7406\uff0c\u65b9\u4fbf\u4ee5\u540e\u4f7f\u7528\u548c\u53c2\u8003\u3002<\/p>\n<h4 id=\"id-\u6a21\u677f-\u6b63\u6587\uff1a\">\u6b63\u6587\uff1a<\/h4>\n<h5 id=\"id-\u6a21\u677f-\u53c2\u8003\u89e3\u7b54\uff1a\">\u53c2\u8003\u89e3\u7b54\uff1a<\/h5>\n<p>\u5224\u65ad\u67d0\u4e2aIP\u662f\u5426\u5728\u67d0\u4e2aIP\u533a\u95f4\u91cc\u9762\uff08\u5148\u8f6c\u6362\u6210IP\u7c7b\u578b(\u4e5f\u5373[]byte\u7c7b\u578b)\uff0c\u7136\u540e\u5229\u7528bytes.Compare\u8fdb\u884c\u6bd4\u8f83\u5373\u53ef\uff09\uff1a<\/p>\n<pre class=\"lang:default decode:true \">package main\r\n\r\nimport (\r\n    \"bytes\"\r\n    \"fmt\"\r\n    \"net\"\r\n)\r\n\r\nvar (\r\n    \/\/ func ParseIP(s string) IP\r\n    \/\/ type IP []byte\r\n    ip1 = net.ParseIP(\"216.14.49.184\")\r\n    ip2 = net.ParseIP(\"216.14.49.191\")\r\n)\r\n\r\nfunc check(ip string) bool {\r\n    trial := net.ParseIP(ip)\r\n    if trial.To4() == nil {\r\n        fmt.Printf(\"%v is not an IPv4 address\\n\", trial)\r\n        return false\r\n    }\r\n    \/\/ func Compare(a, b []byte) int\r\n    if bytes.Compare(trial, ip1) &gt;= 0 &amp;&amp; bytes.Compare(trial, ip2) &lt;= 0 {\r\n        fmt.Printf(\"%v is between %v and %v\\n\", trial, ip1, ip2)\r\n        return true\r\n    }\r\n    fmt.Printf(\"%v is NOT between %v and %v\\n\", trial, ip1, ip2)\r\n    return false\r\n}\r\n\r\nfunc main() {\r\n    fmt.Printf(\"value of ip1: %v, type: %T\\n\", ip1, ip1)\r\n    check(\"1.2.3.4\")\r\n    check(\"216.14.49.185\")\r\n    check(\"1::16\")\r\n}<\/pre>\n<p>&amp;<\/p>\n<p>\u4e0b\u9762\u7684\u4e00\u6bb5\u4ee3\u7801\u5b9e\u73b0\u4e86\u51e0\u4e2a\u529f\u80fd\uff1a<\/p>\n<ul>\n<li>\u501f\u52a9\u00a0<a href=\"http:\/\/myexternalip.com\/raw\">http:\/\/myexternalip.com\/raw<\/a>\u00a0\u83b7\u53d6\u5f53\u524d\u673a\u5668\u7684\u5916\u7f51IP\uff1b<\/li>\n<li>\u5229\u7528 taobao \u7684API\u67e5\u8be2IP\u7684\u5730\u7406\u4f4d\u7f6e\u76f8\u5173\u4fe1\u606f\uff1b<\/li>\n<li>\u83b7\u53d6\u672c\u673a\u7684\u5185\u7f51IP\uff1b<\/li>\n<li>\u5c06IP\u5b57\u7b26\u4e32\u8f6c\u6362\u6210\u6574\u578b&amp;\u5c06\u6574\u578b\u8f6c\u6362\u6210IP\u5b57\u7b26\u4e32\uff1b<\/li>\n<li>\u5224\u65adIP\u662f\u5426\u5728\u67d0\u4e2a\u533a\u95f4\u5185\uff1b<\/li>\n<\/ul>\n<pre class=\"lang:default decode:true \">package main\r\n\r\nimport (\r\n    \"bytes\"\r\n    \"encoding\/json\"\r\n    \"fmt\"\r\n    \"io\/ioutil\"\r\n    \"net\"\r\n    \"net\/http\"\r\n    \"os\"\r\n    \"strconv\"\r\n    \"strings\"\r\n)\r\n\r\ntype IPInfo struct {\r\n    Code int `json:\"code\"`\r\n    Data IP  `json:\"data`\r\n}\r\n\r\ntype IP struct {\r\n    Country   string `json:\"country\"`\r\n    CountryId string `json:\"country_id\"`\r\n    Area      string `json:\"area\"`\r\n    AreaId    string `json:\"area_id\"`\r\n    Region    string `json:\"region\"`\r\n    RegionId  string `json:\"region_id\"`\r\n    City      string `json:\"city\"`\r\n    CityId    string `json:\"city_id\"`\r\n    Isp       string `json:\"isp\"`\r\n}\r\n\r\nfunc main() {\r\n\r\n    external_ip := get_external()\r\n\r\n    external_ip = strings.Replace(external_ip, \"\\n\", \"\", -1)\r\n    fmt.Println(\"\u516c\u7f51ip\u662f: \", external_ip)\r\n\r\n    fmt.Println(\"------Dividing Line------\")\r\n\r\n    ip := net.ParseIP(external_ip)\r\n    if ip == nil {\r\n        fmt.Println(\"\u60a8\u8f93\u5165\u7684\u4e0d\u662f\u6709\u6548\u7684IP\u5730\u5740\uff0c\u8bf7\u91cd\u65b0\u8f93\u5165\uff01\")\r\n    } else {\r\n        result := TabaoAPI(string(external_ip))\r\n        if result != nil {\r\n            fmt.Println(\"\u56fd\u5bb6\uff1a\", result.Data.Country)\r\n            fmt.Println(\"\u5730\u533a\uff1a\", result.Data.Area)\r\n            fmt.Println(\"\u57ce\u5e02\uff1a\", result.Data.City)\r\n            fmt.Println(\"\u8fd0\u8425\u5546\uff1a\", result.Data.Isp)\r\n        }\r\n    }\r\n\r\n    fmt.Println(\"------Dividing Line------\")\r\n\r\n    GetIntranetIp()\r\n\r\n    fmt.Println(\"------Dividing Line------\")\r\n\r\n    ip_int := inet_aton(net.ParseIP(external_ip))\r\n    fmt.Println(\"Convert IPv4 address to decimal number(base 10) :\", ip_int)\r\n\r\n    ip_result := inet_ntoa(ip_int)\r\n    fmt.Println(\"Convert decimal number(base 10) to IPv4 address:\", ip_result)\r\n\r\n    fmt.Println(\"------Dividing Line------\")\r\n\r\n    is_between := IpBetween(net.ParseIP(\"0.0.0.0\"), net.ParseIP(\"255.255.255.255\"), net.ParseIP(external_ip))\r\n    fmt.Println(\"check result: \", is_between)\r\n\r\n    fmt.Println(\"------Dividing Line------\")\r\n    is_public_ip := IsPublicIP(net.ParseIP(external_ip))\r\n    fmt.Println(\"It is public ip: \", is_public_ip)\r\n\r\n    is_public_ip = IsPublicIP(net.ParseIP(\"169.254.85.131\"))\r\n    fmt.Println(\"It is public ip: \", is_public_ip)\r\n\r\n    fmt.Println(\"------Dividing Line------\")\r\n    fmt.Println(GetPulicIP())\r\n}\r\n\r\nfunc get_external() string {\r\n    resp, err := http.Get(\"http:\/\/myexternalip.com\/raw\")\r\n    if err != nil {\r\n        return \"\"\r\n    }\r\n    defer resp.Body.Close()\r\n    \/\/ buf := new(bytes.Buffer)\r\n    \/\/ buf.ReadFrom(resp.Body)\r\n    \/\/ s := buf.String()\r\n    \/\/ return s\r\n    content, _ := ioutil.ReadAll(resp.Body)\r\n    return string(content)\r\n}\r\n\r\nfunc GetIntranetIp() {\r\n    addrs, err := net.InterfaceAddrs()\r\n    if err != nil {\r\n        fmt.Println(err)\r\n        os.Exit(1)\r\n    }\r\n\r\n    for _, address := range addrs {\r\n        \/\/ \u68c0\u67e5ip\u5730\u5740\u5224\u65ad\u662f\u5426\u56de\u73af\u5730\u5740\r\n        if ipnet, ok := address.(*net.IPNet); ok &amp;&amp; !ipnet.IP.IsLoopback() {\r\n            if ipnet.IP.To4() != nil {\r\n                fmt.Println(\"ip:\", ipnet.IP.String())\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nfunc TabaoAPI(ip string) *IPInfo {\r\n    url := \"http:\/\/ip.taobao.com\/service\/getIpInfo.php?ip=\"\r\n    url += ip\r\n\r\n    resp, err := http.Get(url)\r\n    if err != nil {\r\n        return nil\r\n    }\r\n    defer resp.Body.Close()\r\n\r\n    out, err := ioutil.ReadAll(resp.Body)\r\n    if err != nil {\r\n        return nil\r\n    }\r\n    var result IPInfo\r\n    if err := json.Unmarshal(out, &amp;result); err != nil {\r\n        return nil\r\n    }\r\n\r\n    return &amp;result\r\n}\r\n\r\nfunc inet_ntoa(ipnr int64) net.IP {\r\n    var bytes [4]byte\r\n    bytes[0] = byte(ipnr &amp; 0xFF)\r\n    bytes[1] = byte((ipnr &gt;&gt; 8) &amp; 0xFF)\r\n    bytes[2] = byte((ipnr &gt;&gt; 16) &amp; 0xFF)\r\n    bytes[3] = byte((ipnr &gt;&gt; 24) &amp; 0xFF)\r\n\r\n    return net.IPv4(bytes[3], bytes[2], bytes[1], bytes[0])\r\n}\r\n\r\nfunc inet_aton(ipnr net.IP) int64 {\r\n    bits := strings.Split(ipnr.String(), \".\")\r\n\r\n    b0, _ := strconv.Atoi(bits[0])\r\n    b1, _ := strconv.Atoi(bits[1])\r\n    b2, _ := strconv.Atoi(bits[2])\r\n    b3, _ := strconv.Atoi(bits[3])\r\n\r\n    var sum int64\r\n\r\n    sum += int64(b0) &lt;&lt; 24\r\n    sum += int64(b1) &lt;&lt; 16\r\n    sum += int64(b2) &lt;&lt; 8\r\n    sum += int64(b3)\r\n\r\n    return sum\r\n}\r\n\r\nfunc IpBetween(from net.IP, to net.IP, test net.IP) bool {\r\n    if from == nil || to == nil || test == nil {\r\n        fmt.Println(\"An ip input is nil\") \/\/ or return an error!?\r\n        return false\r\n    }\r\n\r\n    from16 := from.To16()\r\n    to16 := to.To16()\r\n    test16 := test.To16()\r\n    if from16 == nil || to16 == nil || test16 == nil {\r\n        fmt.Println(\"An ip did not convert to a 16 byte\") \/\/ or return an error!?\r\n        return false\r\n    }\r\n\r\n    if bytes.Compare(test16, from16) &gt;= 0 &amp;&amp; bytes.Compare(test16, to16) &lt;= 0 {\r\n        return true\r\n    }\r\n    return false\r\n}\r\n\r\nfunc IsPublicIP(IP net.IP) bool {\r\n    if IP.IsLoopback() || IP.IsLinkLocalMulticast() || IP.IsLinkLocalUnicast() {\r\n        return false\r\n    }\r\n    if ip4 := IP.To4(); ip4 != nil {\r\n        switch true {\r\n        case ip4[0] == 10:\r\n            return false\r\n        case ip4[0] == 172 &amp;&amp; ip4[1] &gt;= 16 &amp;&amp; ip4[1] &lt;= 31:\r\n            return false\r\n        case ip4[0] == 192 &amp;&amp; ip4[1] == 168:\r\n            return false\r\n        default:\r\n            return true\r\n        }\r\n    }\r\n    return false\r\n}\r\n\r\nfunc GetPulicIP() string {\r\n    conn, _ := net.Dial(\"udp\", \"8.8.8.8:80\")\r\n    defer conn.Close()\r\n    localAddr := conn.LocalAddr().String()\r\n    idx := strings.LastIndex(localAddr, \":\")\r\n    return localAddr[0:idx]\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<h5 id=\"id-\u6a21\u677f-\u53c2\u8003\u94fe\u63a5\uff1a\">\u53c2\u8003\u94fe\u63a5\uff1a<\/h5>\n<ul>\n<li><a href=\"https:\/\/blog.csdn.net\/wangshubo1989\/article\/details\/78066344\">Go\u5b9e\u6218&#8211;golang\u4e2d\u83b7\u53d6\u516c\u7f51ip\u3001\u67e5\u770b\u5185\u7f51ip\u3001\u68c0\u6d4bip\u7c7b\u578b\u3001\u6821\u9a8cip\u533a\u95f4\u3001ip\u5730\u5740string\u548cint\u8f6c\u6362\u3001\u6839\u636eip\u5224\u65ad\u5730\u533a\u56fd\u5bb6\u8fd0\u8425\u5546\u7b49<\/a>#<span style=\"color: #ff0000;\"><strong>nice<\/strong><\/span><\/li>\n<li><a href=\"https:\/\/stackoverflow.com\/questions\/19882961\/go-golang-check-ip-address-in-range\">\u4f7f\u7528Go\u8bed\u8a00\u68c0\u67e5\u67d0\u4e2aIP\u662f\u5426\u5728\u6307\u5b9a\u7684IP\u533a\u95f4\u8303\u56f4\u5185<\/a>#<span style=\"color: #ff0000;\">nice<\/span><\/li>\n<li><a href=\"https:\/\/blog.csdn.net\/duhf_think\/article\/details\/40894131\">\u4f7f\u7528Go\u8bed\u8a00\u8ba1\u7b97\u7f51\u7edcIP\u5730\u5740\u7684CIDR<\/a><\/li>\n<li><a href=\"http:\/\/outofmemory.cn\/code-snippet\/599\/Go-yuyanban-ip2long-long2ip\">Go\u8bed\u8a00\u7248\u7684ip2long\u548clong2ip<\/a><\/li>\n<\/ul>\n<p>=END=<\/p>\n","protected":false},"excerpt":{"rendered":"<p>=Start= \u7f18\u7531\uff1a \u4e4b\u524d\u5728\u535a\u5ba2\u4e2d\u8bb0\u5f55\u8fc7\u7528Python\u5904\u7406\u8fc7IP\u5730\u5740\u76f8\u5173\u7684\u64cd\u4f5c\uff0c\u6bd4\u5982\u300cPython\u4e2d\u5982\u4f55\u83b7\u53d6 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,7,12],"tags":[1243,564,1242],"class_list":["post-4146","post","type-post","status-publish","format-standard","hentry","category-knowledgebase-2","category-programing","category-tools","tag-bytes-compare","tag-golang","tag-net-parseip"],"views":3605,"_links":{"self":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/4146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/comments?post=4146"}],"version-history":[{"count":1,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/4146\/revisions"}],"predecessor-version":[{"id":4147,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/posts\/4146\/revisions\/4147"}],"wp:attachment":[{"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/media?parent=4146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/categories?post=4146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ixyzero.com\/blog\/wp-json\/wp\/v2\/tags?post=4146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}