c++如何根据ip地址获取所在省份和城市

时间:2021-09-17 10:48:32
请求了骨胳老师,不适java,c#,就是php的,有没大虾知道c或c++代码的?

22 个解决方案

#1


在线等

#2


这个是查询的问题。。。你能拿到数据吗?

#3


google 下 wry.dll。虽然叫dll,但实际不是dll。

#4


你可以去下载IP纯真数据库,然后根据所在IP段,来大概的判断,貌似gh0st就是这样做的

#5


学习呀~~
引用 3 楼 luciferisnotsatan 的回复:
google 下 wry.dll。虽然叫dll,但实际不是dll。

#6


这个问题说白了就是个查询问题,能拿到IP数据库就有办法。腾讯貌似有。

#7


http://www.crsky.com/soft/767.html 这里能下到
用excel可以打开。
可以自己写代码解析,或者导进数据库里

#8


引用 7 楼 luciferisnotsatan 的回复:
http://www.crsky.com/soft/767.html 这里能下到
用excel可以打开。
可以自己写代码解析,或者导进数据库里

然后通过IP去那表格里查出信息

#9


引用 7 楼 luciferisnotsatan 的回复:
http://www.crsky.com/soft/767.html 这里能下到
用excel可以打开。
可以自己写代码解析,或者导进数据库里

既然有数据了,那直接打开excel查询即可,参考:
http://www.codeproject.com/KB/wtl/WTLExcel.aspx

#10


楼主这个问题,QQ面过我...

#11


通过实现跟www.ip138.com的交互,然后获取提交查询后的网页源文件内容,然后在源文件中查找 本站主数据这个字符串,后面的就是你想要的。至于说怎么实现跟网站的交互,可以用libcurl库,或者用WinInet库来做,个人推荐用libcurl库来做

#12


引用 2 楼 dizuo 的回复:
这个是查询的问题。。。你能拿到数据吗?

是查询真实数据库的问题,就是不知道c++怎么查,或者说时c吧,因为我是在linux下的客户端.

#13


引用 3 楼 luciferisnotsatan 的回复:
google 下 wry.dll。虽然叫dll,但实际不是dll。

谢了,wry.dll貌似linux用不了吧-.-

#14


引用 7 楼 luciferisnotsatan 的回复:
http://www.crsky.com/soft/767.html 这里能下到
用excel可以打开。
可以自己写代码解析,或者导进数据库里

这也是个好办法阿,不过下下来后,以后有更新又要下了.目前我们服务端就是这个机制,不过想在客户端处理,最好能有直接从网上的真实数据库里读取数据出来.

#15


引用 6 楼 dizuo 的回复:
这个问题说白了就是个查询问题,能拿到IP数据库就有办法。腾讯貌似有。

腾讯的很蛋疼,我的ip在qq上显示的都跑德国IP去。

#16


引用 14 楼 dolphin_001 的回复:
引用 7 楼 luciferisnotsatan 的回复:

http://www.crsky.com/soft/767.html 这里能下到
用excel可以打开。
可以自己写代码解析,或者导进数据库里

这也是个好办法阿,不过下下来后,以后有更新又要下了.目前我们服务端就是这个机制,不过想在客户端处理,最好能有直接从网上的真实数据库里读取数据出来.


IP地址和地名对应的数据库一般来说是放在服务器上,否则有两个小的问题:
1. 每个客户端上都要装有同样的数据库
2. 数据记录更新时,所有的客户端都要更新,如果在服务器上只需更新一次。
这是自己维护数据库的情况。

如果不想自己维护ip地址数据库,11楼的办法应该可以。

#17


引用 14 楼 dolphin_001 的回复:
这也是个好办法阿,不过下下来后,以后有更新又要下了.目前我们服务端就是这个机制,不过想在客户端处理,最好能有直接从网上的真实数据库里读取数据出来.

如果有的服务端有1w客户连接,你也这么做,算了,还是用本地的吧,这样的话,估计带宽不够吧,君不见灰鸽子的那个就用本地的

#18



#include <cstdio>
#include <curl.h>
#include <cstring>
#include <cstdlib>
#include <types.h>
#include <easy.h>
#pragma comment(lib,"libcurl_imp.lib")

struct BufferStruct
{
char *buffer;
size_t size;
};
static size_t WritememoryCallback(void *ptr,size_t size,size_t nmemb,void *data)
{
size_t realsize=size*nmemb;
BufferStruct *mem=(BufferStruct *)data;
mem->buffer=(char*)realloc((void*)(mem->buffer),mem->size+realsize+1);
if(mem->buffer)
{
memcpy(&(mem->buffer[mem->size]),ptr,realsize);
mem->size+=realsize;
mem->buffer[mem->size]=0;
}
return realsize;
}

int main()
{
curl_global_init(CURL_GLOBAL_ALL);
CURL *myHandle;
CURLcode result;
BufferStruct output;
output.buffer=NULL;
output.size=0;
myHandle=curl_easy_init();

curl_easy_setopt(myHandle,CURLOPT_WRITEFUNCTION,WritememoryCallback);
curl_easy_setopt(myHandle,CURLOPT_WRITEDATA,(void*)&output);
curl_easy_setopt(myHandle,CURLOPT_URL,"http://www.ip138.com/ips.asp?ip=220.165.13.221&action=2");
result=curl_easy_perform(myHandle);
curl_easy_cleanup(myHandle);

FILE *fp;
fp=fopen("maoxin.txt","w");
if(!fp)
return 1;
fprintf(fp,output.buffer);
fclose(fp);



if(output.buffer)
{
free(output.buffer);
output.buffer=0;
output.size=0;
}
return 0;
}

这个代码实现了把提交后的网页下载到本地,你可以去网上下个libcurl库来编译,由于时间有限,我就不写怎么解析出地址的代码了

#19


你先用抓包工具抓包就可以看到很多了,
http://www.ip138.com/ips.asp?ip=220.165.13.221&action=2
你将ip=后的ip换成你要查的ip就可以了

#20


引用 17 楼 maoxing63570 的回复:
引用 14 楼 dolphin_001 的回复:
这也是个好办法阿,不过下下来后,以后有更新又要下了.目前我们服务端就是这个机制,不过想在客户端处理,最好能有直接从网上的真实数据库里读取数据出来.

如果有的服务端有1w客户连接,你也这么做,算了,还是用本地的吧,这样的话,估计带宽不够吧,君不见灰鸽子的那个就用本地的

想想还是放在本地好,再综合16楼的想法,放在服务端还是比较妥当的.这块已经用java实现过了.谢谢各位了.尤其是17楼哈,连实现代码都有了, 搞ui搞太多,底层库都不熟练-.-

#21


mark

#22


回复于:2011-06-08 18:02:32

#1


在线等

#2


这个是查询的问题。。。你能拿到数据吗?

#3


google 下 wry.dll。虽然叫dll,但实际不是dll。

#4


你可以去下载IP纯真数据库,然后根据所在IP段,来大概的判断,貌似gh0st就是这样做的

#5


学习呀~~
引用 3 楼 luciferisnotsatan 的回复:
google 下 wry.dll。虽然叫dll,但实际不是dll。

#6


这个问题说白了就是个查询问题,能拿到IP数据库就有办法。腾讯貌似有。

#7


http://www.crsky.com/soft/767.html 这里能下到
用excel可以打开。
可以自己写代码解析,或者导进数据库里

#8


引用 7 楼 luciferisnotsatan 的回复:
http://www.crsky.com/soft/767.html 这里能下到
用excel可以打开。
可以自己写代码解析,或者导进数据库里

然后通过IP去那表格里查出信息

#9


引用 7 楼 luciferisnotsatan 的回复:
http://www.crsky.com/soft/767.html 这里能下到
用excel可以打开。
可以自己写代码解析,或者导进数据库里

既然有数据了,那直接打开excel查询即可,参考:
http://www.codeproject.com/KB/wtl/WTLExcel.aspx

#10


楼主这个问题,QQ面过我...

#11


通过实现跟www.ip138.com的交互,然后获取提交查询后的网页源文件内容,然后在源文件中查找 本站主数据这个字符串,后面的就是你想要的。至于说怎么实现跟网站的交互,可以用libcurl库,或者用WinInet库来做,个人推荐用libcurl库来做

#12


引用 2 楼 dizuo 的回复:
这个是查询的问题。。。你能拿到数据吗?

是查询真实数据库的问题,就是不知道c++怎么查,或者说时c吧,因为我是在linux下的客户端.

#13


引用 3 楼 luciferisnotsatan 的回复:
google 下 wry.dll。虽然叫dll,但实际不是dll。

谢了,wry.dll貌似linux用不了吧-.-

#14


引用 7 楼 luciferisnotsatan 的回复:
http://www.crsky.com/soft/767.html 这里能下到
用excel可以打开。
可以自己写代码解析,或者导进数据库里

这也是个好办法阿,不过下下来后,以后有更新又要下了.目前我们服务端就是这个机制,不过想在客户端处理,最好能有直接从网上的真实数据库里读取数据出来.

#15


引用 6 楼 dizuo 的回复:
这个问题说白了就是个查询问题,能拿到IP数据库就有办法。腾讯貌似有。

腾讯的很蛋疼,我的ip在qq上显示的都跑德国IP去。

#16


引用 14 楼 dolphin_001 的回复:
引用 7 楼 luciferisnotsatan 的回复:

http://www.crsky.com/soft/767.html 这里能下到
用excel可以打开。
可以自己写代码解析,或者导进数据库里

这也是个好办法阿,不过下下来后,以后有更新又要下了.目前我们服务端就是这个机制,不过想在客户端处理,最好能有直接从网上的真实数据库里读取数据出来.


IP地址和地名对应的数据库一般来说是放在服务器上,否则有两个小的问题:
1. 每个客户端上都要装有同样的数据库
2. 数据记录更新时,所有的客户端都要更新,如果在服务器上只需更新一次。
这是自己维护数据库的情况。

如果不想自己维护ip地址数据库,11楼的办法应该可以。

#17


引用 14 楼 dolphin_001 的回复:
这也是个好办法阿,不过下下来后,以后有更新又要下了.目前我们服务端就是这个机制,不过想在客户端处理,最好能有直接从网上的真实数据库里读取数据出来.

如果有的服务端有1w客户连接,你也这么做,算了,还是用本地的吧,这样的话,估计带宽不够吧,君不见灰鸽子的那个就用本地的

#18



#include <cstdio>
#include <curl.h>
#include <cstring>
#include <cstdlib>
#include <types.h>
#include <easy.h>
#pragma comment(lib,"libcurl_imp.lib")

struct BufferStruct
{
char *buffer;
size_t size;
};
static size_t WritememoryCallback(void *ptr,size_t size,size_t nmemb,void *data)
{
size_t realsize=size*nmemb;
BufferStruct *mem=(BufferStruct *)data;
mem->buffer=(char*)realloc((void*)(mem->buffer),mem->size+realsize+1);
if(mem->buffer)
{
memcpy(&(mem->buffer[mem->size]),ptr,realsize);
mem->size+=realsize;
mem->buffer[mem->size]=0;
}
return realsize;
}

int main()
{
curl_global_init(CURL_GLOBAL_ALL);
CURL *myHandle;
CURLcode result;
BufferStruct output;
output.buffer=NULL;
output.size=0;
myHandle=curl_easy_init();

curl_easy_setopt(myHandle,CURLOPT_WRITEFUNCTION,WritememoryCallback);
curl_easy_setopt(myHandle,CURLOPT_WRITEDATA,(void*)&output);
curl_easy_setopt(myHandle,CURLOPT_URL,"http://www.ip138.com/ips.asp?ip=220.165.13.221&action=2");
result=curl_easy_perform(myHandle);
curl_easy_cleanup(myHandle);

FILE *fp;
fp=fopen("maoxin.txt","w");
if(!fp)
return 1;
fprintf(fp,output.buffer);
fclose(fp);



if(output.buffer)
{
free(output.buffer);
output.buffer=0;
output.size=0;
}
return 0;
}

这个代码实现了把提交后的网页下载到本地,你可以去网上下个libcurl库来编译,由于时间有限,我就不写怎么解析出地址的代码了

#19


你先用抓包工具抓包就可以看到很多了,
http://www.ip138.com/ips.asp?ip=220.165.13.221&action=2
你将ip=后的ip换成你要查的ip就可以了

#20


引用 17 楼 maoxing63570 的回复:
引用 14 楼 dolphin_001 的回复:
这也是个好办法阿,不过下下来后,以后有更新又要下了.目前我们服务端就是这个机制,不过想在客户端处理,最好能有直接从网上的真实数据库里读取数据出来.

如果有的服务端有1w客户连接,你也这么做,算了,还是用本地的吧,这样的话,估计带宽不够吧,君不见灰鸽子的那个就用本地的

想想还是放在本地好,再综合16楼的想法,放在服务端还是比较妥当的.这块已经用java实现过了.谢谢各位了.尤其是17楼哈,连实现代码都有了, 搞ui搞太多,底层库都不熟练-.-

#21


mark

#22


回复于:2011-06-08 18:02:32