怎样把许多ip地址查询 api合成1个API用甚么软件

两种方法都是通过先得到主机名再获取IP地址:
The&gethostname&function retrieves the standard host name for the local computer.
int gethostname(
Parameters
name[out] Pointer to a buffer that receives the local host name.namelen[in] Length of the buffer, in bytes&&&&
char hostname[50];
gethostname(hostname,50);即可得到主机名。有了主机名下一步就是获取IP地址,方法一是通过API函数 gethostbyname,需要注意的事这个函数仅仅适用于IPv4,该函数再MSDN中的注释如下:
The&gethostbyname&function retrieves host information corresponding to a host name from a host database.
Note&& The&gethostbyname&function has been deprecated by the introduction of the&function. Developers creating Windows Sockets 2 applications are urged to use the&getaddrinfofunction instead of&gethostbyname.
struct hostent* FAR gethostbyname(
const char*
通过传递主机名得到的返回值是一个hosten结构体指针,
typedef struct hostent {
char FAR* ;
我们需要使用其中的,通过
LPCSTR pszIP=inet_ntoa (*(struct in_addr *)pHost-&h_addr_list[0);即可得到IP地址,
注意h_addr_list是主机地址列表,我们这里取的事第一个值,有的电脑装有多个网卡可能有多个IP地址。
方法二是通过API函数getaddrinfo,通过上面的注释也可以看出MS推荐我们使用这个函数代替
gethostbyname,因为这个函数既适用于IPv4也适用于IPv6,详见MSDN。
The getaddrinfo function provides protocol-independent translation from host name to address.
int getaddrinfo(
const TCHAR* ,
const TCHAR* ,
const struct addrinfo* ,
struct addrinfo**
Parameters
nodename [in] Pointer to a null-terminated string containing a host (node) name or a numeric host address string. The numeric host address string is a dotted-decimal IPv4 address or an IPv6 hex address. servname [in] Pointer to a null-terminated string containing either a service name or port number. hints [in] Pointer to an
structure that provides hints about the type of socket the caller supports. See Remarks. res [out] Pointer to a linked list of one or more addrinfo structures containing response information about the host.
MSDN说这个函数是用来提供一种与协议无关的主机名转换为地址的方法,参照MSDN上面的例子经过试验得出下面获取IP的方法:
gethostname(hostname,100);&& //获得主机的名称getaddrinfo(hostname,NULL,&hints,&res);&& //利用主机名称获取本地地址char buff[100];DWORD bufflen=100;//将本地地址转换成字符串显示struct sockaddr_in* pSockaddr=(sockaddr_in*)res-&ai_char *pIP=inet_ntoa(pSockaddr-&sin_addr);
这里为什么说经过试验呢,MSDN上面的例子将getaddrinfo函数的前两个参数分别设置为主机IP和端口号,显然第一个参数不能设为主机IP了,根据其注释这个参数既可以为主机名也可以是IP,所以设为主机名,第二个参数说可以是一个服务名或者端口号,如果设为端口号,用WSAAddressToString函数获取的值中就包括该端口号,我也不太清楚这是什么原因,总之感觉这个Socket函数很诡异。
阅读(...) 评论() &下次自动登录
现在的位置:
& 综合 & 正文
教你如何自己制作IP地址查询的API,摆脱第三方API—(一)
员在WEB开发或者其他一些开发中,经常会使用IP地址查询的功能,即通过用户的IP,去查询用户所在的地区。
本文给出一种方法,利用互联网上现有的资源,让各位可以自己实现IP地址查询的功能。
本文是教程(一),介绍的功能是如何获取本机的外网IP和地理位置,如果想知道如何获取任意IP的地理位置,请看后续教程。
读者可以先打开这个链接:/,我们会发现有几行重要的字:
您的IP是:[131.23.132.323] 来自:xx省xx
这个就是我们所需要的信息,我们通过浏览器查看网页,结果惊奇的发现,源码里没有这一段,这是为什么?
分析一下,网页里的内容有两个来源,一个是来自于浏览器最初从服务器获取的html源码中的内容,还有一个是浏览器加载页面之后,由页面向服务器发送请求获取的数据,既然页面源码中没有这段数据,那一定是通过AJAX请求获得的数据。
通过抓包工具(这里用的是firebug)我们发现,其实这段信息,是在网页加载之后,页面向服务器发送的异步请求(AJAX)返回的数据。
这个AJAX请求规格如下:
url:/ic.asp
返回数据:
问题已经解决了,我们只需要向/ic.asp发送一个简单的url请求,就可以获得如上的返回数据,通过解析html源,取出¢er&和&/center&之间的部分,即可获得本机IP和地理信息:“您的IP是:[131.23.132.323]
来自:xx省xx市 电信”,再经过简单的处理,即可获得规则的IP和地址。
下面给出源码:
&&&&推荐文章:
【上篇】【下篇】cache file NOT exists!

参考资料

 

随机推荐