注意:

  可能每个电脑的默认中文编码格式不同,有时会出现乱码,需要对返回内容进行编码转换,或者换成可指定编码格式的接口。如

   搜狐IP地址查询接口(可设置编码):http://pv.sohu.com/cityjson?ie=utf-8

根据IP地址获得当前网络的所在的地理位置

1、几个免费IP地址查询API接口如下:

  1. 搜狐IP地址查询接口(默认GBK):http://pv.sohu.com/cityjson
  2. 搜狐IP地址查询接口(可设置编码):http://pv.sohu.com/cityjson?ie=utf-8
  3. 126 http://ip.ws.126.net/ipquery
  5. IP地址查询接口:http://apis.juhe.cn/ip/ip2addr
    要先去https://www.juhe.cn/docs/api/id/1申请APPKEY
  6. 新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js
    新浪这个应该说是最不错的。并且返回的数据类型为可以自定义格式(默认为纯文本格式,根据format的参数定义,还可以返回JS、Json格式)。
  7. 新浪多地域测试方法:
    http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=219.242.98.111
  8. 淘宝 http://ip.taobao.com/service/getIpInfo.php?ip=117.89.35.58

  参考:
    httphttp://blog.csdn.net/ishxiao/article/details/52670242
    httphttp http://blog.csdn.net/kong1940742529/article/details/54945924

2、本文采用的是 搜狐IP地址查询接口

  http://pv.sohu.com/cityjson?ie=utf-8

  返回结果:

    var returnCitySN = {"cip": "36.23.67.140", "cid": "330000", "cname": "浙江省"};

  在 ubuntu 14.04 c++ 使用 libcurl 库发送请求:

代码如下:  

getCityByIp.cpp
   #include <stdio.h>
#include <curl/curl.h>
#include <iostream>
#include <jsoncpp/json/json.h> using namespace std; int writer(char *data, size_t size, size_t nmemb, string *writerData)
{
unsigned long sizes = size * nmemb;
if (writerData == NULL)
return -; writerData->append(data, sizes); return sizes;
} string parseJsonLocation(string input)
{
Json::Value root;
Json::Reader reader; if("" != input)
{
input = input.substr((int)input.find("{"));
} bool parsingSuccessful = reader.parse(input, root);
if(!parsingSuccessful)
{
std::cout<<"!!! Failed to parse the location data"<< std::endl;
return "";
} // Json::StyledWriter sw;
// cout << sw.write(root) << endl; //缩进输出 string cip = root["cip"].asString();
string cname = root["cname"].asString(); return cname;
} string ()
{
string buffer="";
string location="";
try
{
CURL *pCurl = NULL;
CURLcode res; curl_global_init(CURL_GLOBAL_ALL); // In windows, this will init the winsock stuff
string url_str = "http://pv.sohu.com/cityjson?ie=utf-8";//http://ip.ws.126.net/ipquery"; pCurl = curl_easy_init(); // get a curl handle
if (NULL != pCurl)
{
curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, );
curl_easy_setopt(pCurl, CURLOPT_URL, url_str.c_str());
curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, &buffer);
res = curl_easy_perform(pCurl); if (res != CURLE_OK)
{
printf("curl_easy_perform() failed:%s\n", curl_easy_strerror(res));
} curl_easy_cleanup(pCurl);
}
curl_global_cleanup();
}
catch (std::exception &ex)
{
printf("curl exception %s.\n", ex.what());
}
if(buffer.empty())
{
std::cout<< "!!! ERROR The sever response NULL" << std::endl;
}
else
{
location = parseJsonLocation(buffer);
} return location;
} int main(int argc, char const *argv[])
{
cout<< getCityByIp();
return ;
}

Makefile

    SRC_OBJ=getCityByIp.o
SRC_BIN=getCityByIp
SRC_LIB= -ljsoncpp -lcurl
CC=g++ ${SRC_BIN} : ${SRC_OBJ}
${CC} -o $@ $^ ${SRC_LIB}
${RM} ${SRC_OBJ} clean:
${RM} ${SRC_OBJ} ${SRC_BIN}

linux c++ curl 根据IP地址获得当前网络的所在的地理位置的更多相关文章

  1. 在linux中设置静态ip地址

    在linux中设置静态ip地址1.在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0 2.开始编辑,填写ip地址.子网掩码.网关.DNS等[root ...

  2. 修改ip 在linux上永久修改IP地址 子网掩码

    小结: 1. 子网掩码.子网IP计算 2. linux centos 修改ip地址细节介绍_LINUX_操作系统_脚本之家 http://www.jb51.net/LINUXjishu/66509.h ...

  3. 根据ip地址从第三方接口获取详细的地理位置

    最近项目某个功能需要根据ip地址从第三方接口获取详细的地理位置,从网上找了很多例子,主要接口有新浪的,淘宝的,腾讯的.试了淘宝的,如果是数量级小的还可以,如果数量级达到上十万级就速度慢了,会导致系统崩 ...

  4. android开发工具类之获得WIFI IP地址或者手机网络IP

    有的时候我们需要获得WIFI的IP地址获得手机网络的IP地址,这是一个工具类,专门解决这个问题,这里需要两个权限: <uses-permission android:name="and ...

  5. ip地址中的网络号,主机号

    当前使用的IP地址有4个字节(32bit)组成,即IPV4编码方式.每个IP地址包括两部分:网络号和主机号.当分配给主机号的二进制位越多,则能标识的主机数就越多,相应地能标识的网络数就越少,反之同理. ...

  6. MSF魔鬼训练营-3.1.1信息收集-通过DNS和IP地址挖掘目标网络信息

    情报搜集环境站渗透测试全过程的80%~90%   一.外围信息搜集(公开渠道信息搜集OSINT  open source intelligence) 3.1.1信息收集-通过DNS和IP地址挖掘目标网 ...

  7. Linux网络管理1---(Linux配置IP地址,ifconfig、配置文件)

    1.Linux配置IP 地址 ifconfig命令临时配置IP 地址 ifconfig命令,最常用的功能是查看本机的网络的配置状态(当然也可以配置网络,不过是暂时性的),直接输入ifconfig命令就 ...

  8. Linux下如何修改ip地址

    在Linux的系统下如何才能修改IP信息 以前总是用ifconfig修改,重启后总是得重做.如果修改配置文件,就不用那么麻烦了- A.修改ip地址 即时生效: # ifconfig eth0 192. ...

  9. SUSE Linux Enterprise Server 设置IP地址、网关、DNS

    说明: ip:192.168.21.172 子网掩码:255.255.255.0 网关:192.168.21.2 dns:8.8.8.8 8.8.4.4 1.设置ip地址 vi /etc/syscon ...

随机推荐

  1. [macOS] PHP双版本,5.6跟7.1

    转过来的,原文看这里,https://www.symfony.fi/page/how-to-run-both-php-5-6-and-php-7-x-with-homebrew-on-os-x-wit ...

  2. The Designer (笛卡尔定理+韦达定理 || 圆的反演)

    Nowadays, little haha got a problem from his teacher.His teacher wants to design a big logo for the ...

  3. DB2 错误代码

    sqlcode sqlstate 说明 000 00000 SQL语句成功完成 01xxx SQL语句成功完成,但是有警告 +012 01545 未限定的列名被解释为一个有相互关系的引用 +098 0 ...

  4. 鼠标右键vsCode打开

    有时候在安装vscode不会出现鼠标右键用vscode打开的情况: 最终要实现的样子: 解决办法如下步骤: 1.安装vscode: 2.新建一个“.reg”为后缀的文件: 3.把下面内容复制到文件中: ...

  5. Zeu.js

    一个生成各种 GIF 动画的 JavaScript 类库,非常适合用于让你的数据展示变得更加地生动.使用起来也非常简单,有数据展示需求的同学可以尝试一下.https://shzlw.github.io ...

  6. js 二维数组 for 循环重新赋值

    javascript 二维数组的重新 组装 var arr = [[1,2],[3,4],[5,6],[7,8]]; var temp = new Array(); for(var i= 0 ;i&l ...

  7. [c/c++] programming之路(25)、字符串(六)——memset,Unicode及宽字符,strset

    一.memset #include<stdio.h> #include<stdlib.h> #include<memory.h> void *mymemset(vo ...

  8. JS设计模式(8)模板方法模式

    什么是模板方法模式? 定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 主要解决:一些方法通用,却在每一个子类都重新 ...

  9. Guitar Pro里的编谱方式怎么用?

    今天来教大家如何使用Guitar Pro中的编谱方式来让我们的乐谱更加美观整齐耐看,我们一起get起来吧! 相信我们每一个人在使用Guitar Pro进行编曲创作时,都会碰到这种情况,在乐谱上,会看到 ...

  10. 爆料:2019手游折扣app是真福利还是骗人哪个靠谱?

    直接上干货.也许你在找寻,安全的手游折扣App,稳定的手游折扣App,不断续充的折扣App,续充不涨价的折扣App,网上的内容太多,难以分辨.那么看这个可以直接给你答案 1.历史(2004年成立,15 ...