获取指定域名的IP地址

所需函数:gethostbyname

函数原型:

struct hostent* gethostbyname(const char *name)

参数:const char *name  //主机名或域名

返回值:函数执行成功会返回一个hostent结构体,其结构体原型如下:

struct hostent{char *h_name;//主机正式名char ** h_aliases;//主机别名short h_addrtype;//主机地址类型一般为2表示是AF_INETshort h_length;//地址长度,32位地址长度为4个字节char ** h_addr_list; //存储主机地址的数组。此处要注意的是该成员可以存储多个IP地址,即如其名称所言,地址列表。当获取到hostent结构指针后,要读取地址信息。应该使用强制转换为in_addr*(用来表示IV_4IP的TCP结构体)再使用。我刚开始使用的时候以为每个h_addr_list[i]就是一个地址列表的字符,结果得到的不是自己想要的。};

函数执行失败会返回一个空指针,并且可以通过WSAGetLastError来获取错误码

WSANOTINITIALISED 在应用这个API前,必须成功地调用WSAStartup()。WSAENTDOWN Windows Sockets实现检测到了网络子系统的错误。WSAHOST_NOT_FOUND 没有找到授权应答主机。WSATRY_AGAIN 没有找到非授权主机,或者SERVERFAIL。WSANO_RECOVERY 无法恢复的错误,FORMERR,REFUSED,NOTIMP。WSANO_DATA 有效的名字,但没有关于请求类型的数据记录。WSAEINPROGRESS 一个阻塞的Windows Sockets操作正在进行。WSAEINTR 阻塞调用被WSACancelBlockingCall()取消了.

示例:

#include <Winsock2.h>#pragma comment(lib,"WS2_32.lib")           //套接字库int main(){WSAData wsa;WSAStartup(MAKEWORD(2, 2)/*使用2.2的winsock版本库*/, &wsa);hostent *phst = gethostbyname("www.Google.com");//传递域名/主机名in_addr * iddr = (in_addr*)phst->h_addr;//h_addr = h_addr_list[0],获取地址列表第一个地址IPunsigned long IPUL = iddr->s_addr;//获取无符号的网络字节序,该符号通常以大端形式存储char *IP = inet_ntoa(*iddr);//将十进制的大端存储的网络字节讯转化为以.分割的字符IP_4地址,并以小端形式存储printf("%s", IP);//打印getchar();}

运行结果:

有的时候你会发现你能获取某个网站的IP地址时能获取到多个IP地址,就像h_addr_list这个成员变量一样,这里来说明一下,DNS服务器,DNS服务器是负责用于解析某个域名的IP的,它会把解析结果返回给浏览器,浏览器在通过解析结果,来进行TCP/IP的连接,那么DNS服务器是什么?

DNS服务器是由ICANN(全球互联网域名与数字地址(IP)分配机构)维护的,后ICANN将亚太地区(亚洲大陆)的DNS服务器交给apnic维护,并且其它大陆的也分别交给不同的信息中心维护,美国是由ICANN维护的,但其资源是共享的,我们平常在一些域名供应商购买域名时,通过域名捆绑IP时供应商会将这些信息通过信息中心提供的结构解析到信息中心中!

且域名也是有ICANN维护的,我们平常在注册域名都要查一下域名是否被注册,这些都是通过ICANN提供的接口查询的,并且不同国家也有不同的政策,比如万网需要备案,但其万网背后所使用的接口均为apnic提供的!

并且可以通过域名供应商来设置DNS服务器的解析方式,有的时候一个域名可以拥有多个服务器,学网站制作的应该有了解,毕竟一个服务器是不能承载上千万的同时访问量的,其次考虑到线路方面的传递效率问题,很多大型网站会在不同地方设立不同的服务器,然后在域名供应商里把域名与多个服务器的独立IP绑定在一起,在设置一下解析模式即可!

只需要在DNS域名解析里把同一个域名解析到不同的服务器IP上即可!

这样在访问时DNS服务器会根据你当前的线路给你选择距离你最近的线路,这样线路传递数据的效率也有所提升,速度上也增加,解析只能通过地区不会精准到住所!

浏览器在域名解析时会把当前调用接口来进行请求其底层是TCP/IP协议,这样的话你的IP还会被传递过去,DNS服务器就可以通过你的IP来确定你的位置!

如何确定位置?

答:

根据IP号段,供应商在给你的互联网设备分配IP不是乱分配的,会根据你注册情况,提供的地址,来给你确定IP,比如123.26-155.26IP号段为上海市浦东新区,那么假如你的IP号段(IP地址前两个)在此范围内,那就可以确定地区了,随着人数的增多,有的时候会发现不在此范围内的号段也是某某地区的,是因为人数的增多,扩展出新的号段,不过这些我们是不需要关心的,因为这些是运营商自己后台会存储扩展好的!

Gethostbyname函数内部其实调用的是netconn_gethostbyname函数,netconn_gethostbyname函数是lwip(基于TCP/IP的开源小型协议栈,是瑞典计算机科学院(SICS)Adam Dunkels开发的)下的一个DNS域名查询接口开发的,并且此接口只要有TCP/IP库,即可调用,无需操作系统支持,并且TCP/IP库是纯C开发的,没有操作系统限制,适合嵌入式!

相关连接:网络通讯过程-互联网详解

获取指定域名的IP地址相关推荐

  1. Java 网络实例一(获取指定主机的IP地址、查看端口是否已使用、获取本机ip地址及主机名、获取远程文件大小)

    获取指定主机的IP地址 import java.net.InetAddress; import java.net.UnknownHostException;public class GetIP {pu ...

  2. Nginx+Tomcat无法正确获取的域名和ip地址

    在利用Nginx作为反向代理服务器的时候,出现一个问题,就是在Tomcat中的web项目获取当前访问域名地址的时候,无法获取到真实的域名或IP地址,进过一系列摸索,最终找到解决办法. 之前的Nginx ...

  3. JAVA 获取指定网址的IP地址 实例

    如今买票是一大难事,在高峰时段 打开12306网站,慢的像蜗牛,想到以前用修改hosts文件来登录Google(Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址 ...

  4. C/C++获取指定网口的IP地址

    /**功能:传入一个网口名,获取相应的IP地址* */#include <stdio.h> #include <ifaddrs.h> #include <netinet/ ...

  5. php ip获取邮政编码,php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法...

    这篇文章主要介绍了php获取指定(访客)IP所有信息(地址.邮政编码.国家.经纬度等)的方法,通过一个API接口调用实现针对访客信息的相关查询功能,非常简单实用, 本文实例讲述了php获取指定(访客) ...

  6. 实时获取端口号和ip地址(域名)

    使用自定义获取端口号和ip地址(域名)window.location 在项目当中,很多项目是属于外包的,当项目做完就需要部署然后交给甲方,那么此时项目就不是我们负责 端口号,和域名,后期因为部署到服务 ...

  7. php ip获取邮政编码,php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法,所有信息经纬度...

    php获取指定(访客)IP所有信息(地址.邮政编码.国家.经纬度等)的方法,所有信息经纬度 本文实例讲述了php获取指定(访客)IP所有信息(地址.邮政编码.国家.经纬度等)的方法.分享给大家供大家参 ...

  8. DNS这位“翻译官”是如何转换域名和IP地址的?

    DNS这位"翻译官"是如何转换域名和IP地址的? Linux就该这么学 1周前 DNS( Domain Name System)是"域名系统"的英文缩写,是一种 ...

  9. linux shell 域名 ip,Shell脚本一种检查Linux中域名和IP地址所有权信息、检查多个域名的到期日期工具...

    Shell脚本一种检查Linux中域名和IP地址所有权信息.检查多个域名的到期日期工具 jwhois是一个命令行实用程序,可从whois服务器(whois数据库)中获取有关域名所有权的信息. Whoi ...

最新文章

  1. 在weex 中的引入 Ethereum -web3.js
  2. 头插法、尾插法的理解
  3. python从基础到进阶_无需编程基础,Python从入门到进阶大法
  4. proc下kcore是什么文件
  5. pandas DataFrame 索引(二)
  6. Linux中的crontab详解
  7. 开源数据分析工具 CyberChef
  8. leetcode题库:5.最长回文子串Longest Palindrome string
  9. SqlServer2000中作业无法删除的原因和解决办法
  10. android之sqlite操作
  11. 的大小name转为小写_linux 进程 -- ps -ef|grep process_name
  12. 浏览器javascript 下载m3u8视频合成mp4
  13. redis trib 常用命令
  14. 作为程序员,我将如何教育自己的孩子
  15. 车牌识别matlab,车牌识别matlab实现(蓝色车牌和新能源车牌)
  16. 多表查询时,执行速度耗时太多
  17. 【高精度】高精度加法 C++题解
  18. 产品经理面试问题:上一家公司的离职原因
  19. Java并发编程系列学习_CountDownLatch倒计时器CyclicBarrier循环栅栏
  20. Marketing™Series用户手册(Marketing™Series Manual)

热门文章

  1. c调用python函数_python - Linux C调用Python 函数
  2. android listview 只加载显示的图片大小,Android ListView只加载当前屏幕内的图片(解决list滑动时加载卡顿)...
  3. atm系统的用例模型_ATM银行系统用例图.doc
  4. 部署集群linux Oracle VM VirtualBox vagrant
  5. sql 更新一些特殊要求字段(批量)
  6. java分布式缓存memcached_分布式缓存系统Memcached学习心得
  7. php插件改名,自制functions.php文件or插件,防止升级或更换主题时被替换
  8. python oracle连接池_python - DBUtils 连接池减少oracle数据库的连接数
  9. 计算机格式化系统,硬盘被苹果电脑格式化后如何恢复数据?
  10. 杨凌职业技术学院计算机专业宿舍,杨凌职业技术学院宿舍条件,宿舍图片和环境空调及分配方法...