和朋友一起做课程设计,同时学习C语言的网络编程,以前写的都是python网络编程,但python很多的库都是封装好的,大部分人在使用的时候不会去了解底层的实现,这样对长远的学习不太好,也改正自己这方面的依赖。

想要把大象放进冰箱分为三步:第一步,把冰箱门打开,第二步,把大象放进去,第三步,关上冰箱门。

我们同样把这道题目也分解:第一步,将输入的url转换成IP地址,第二步,访问IP地址,HTTP协议默认是80端口,第三步,获取题目中我们需要的信息,跟python爬虫类似,第四步,将程序可视化,打包成exe文件。

样例程序最终样子为:

或者这样

先进行第一步:将输入的域名转换成IP地址

其实在写的时候可以想到,如果目标站点使用的CDN的话,我们是不能获取到真实IP地址的,不过我们也不是为了获取真实IP,只要能拿到返回信息就行了。

使用gethostbyname() 函数可以完成域名到IP地址的转换

它的原型为:

struct hostent *gethostbyname(const char *hostname);

  hostname 为主机名,也就是域名。使用该函数时,只要传递域名字符串,就会返回域名对应的IP地址。返回的地址信息会装入 hostent 结构体,该结构体的定义如下:

struct hostent{
char *h_name; //official name
char **h_aliases; //alias list
int h_addrtype; //host address type
int h_length; //address lenght
char **h_addr_list; //address list
}

  可以看到,我们只需要传入一个域名字符串hostname,使用gethostbyname后,会返回一个hostent的结构体,其结构体内部存在五个成员,其具体信息为:

h_name:官方域名(Official domain name)。官方域名代表某一主页,但实际上一些著名公司的域名并未用官方域名注册。
h_aliases:别名,可以通过多个域名访问同一主机。同一IP地址可以绑定多个域名,因此除了当前域名还可以指定其他域名。
h_addrtype:gethostbyname() 不仅支持 IPv4,还支持 IPv6,可以通过此成员获取IP地址的地址族(地址类型)信息,IPv4 对应 AF_INET,IPv6 对应 AF_INET6。
h_length:保存IP地址长度。IPv4 的长度为4个字节,IPv6 的长度为16个字节。
h_addr_list:这是最重要的成员。通过该成员以整数形式保存域名对应的IP地址。对于用户较多的服务器,可能会分配多个IP地址给同一域名,利用多个服务器进行均衡负载。

  我们可以根据我们的需要取返回结构体中的成员,这里我们用到的是

h_addr_list

  注意,可能返回的不止一个IP地址,所以我们需要使用一个循环输出所有的IP地址

在写代码之前我们先把环境配置好

在windows环境下,使用的库文件是:

#include <winsock2.h>

  在Linux环境下,使用的库文件是:

#include <netdb.h>

  我这里使用的是Ubuntu环境编写的该代码,代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<netdb.h>
#include<unistd.h>
#include<arpa/inet.h> int main(){
struct hostent *host;
char hostname[40];
int i;
printf("please input domain:\n");
scanf("%s",hostname);
getchar();
host=gethostbyname(hostname);
if(host==NULL){
printf("%s not get ip,please check domain\n",hostname);
exit(1);
}
printf("hostname is %s\n",host->h_name);
for(i=0;host->h_addr_list[i];i++){
printf("IP addr %d: %s \n",i+1,inet_ntoa(*(struct in_addr*)host->h_addr_list[i]));
}
return 0;
}

  代码很容易看懂,如果把前面的基础知识看了+有C语言基础,应该都能够看懂。

Ubuntu下使用gcc 编译C语言源代码:

$ gcc -o gethostbyname gethostbyname.c 

编译之后运行:

./gethostbyname

可以看到成功输出的www.baidu.com对应的IP地址,完成了第一步代码的编写。

参考链接:

http://c.biancheng.net/cpp/html/3048.html

https://blog.csdn.net/qq_19004627/article/details/84784815

最新文章

  1. jquery插件扩展的学习
  2. Go语言执行系统命令行命令(转)
  3. Ubuntu gcc缺失问题
  4. Linux:-bash: ***: command not found,系统很多命令都用不了
  5. Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串
  6. IO流05--毕向东JAVA基础教程视频学习笔记
  7. MongoDB安装及shell简介
  8. .Net 三款工作流引擎比较:WWF、netBPM 和 ccflow
  9. IOS开发之—— Core Foundation对象与OC对象相对转换的问题
  10. PO、VO、BO、DTO
  11. json 字符串转换成对象,对象转换成json字符串
  12. 如何让vnc控制由默认的twm界面改为gnome?(转)
  13. angular项目——小小记事本2
  14. [bzoj4832]抵制克苏恩 概率dp
  15. [ZZ] NumPy 处理数据
  16. ubuntu “无法获得锁 /var/lib/dpkg/lock -open”
  17. kubernetes yaml格式的Pod配置文件
  18. kali linux 安装wps office
  19. Django学习手册 - 模板继承与导入
  20. Redis进阶实践之十四 Redis-cli命令行工具使用详解

热门文章

  1. gitlab - 解决添加webhook提示Url is blocked: Requests to the local network are not allowed的问题
  2. kernel 目录
  3. maven pom.xml 报错
  4. 一文看懂Java序列化之serialVersionUID
  5. TCP/IP模型简介和/etc/hosts文件说明
  6. SQL IsNull函数详解
  7. IDEA 使用的一些快捷键记录
  8. android下vulkan与opengles纹理互通
  9. SQL语句的学习
  10. Linux安装部署Redis(超级详细)