C语言网络编程(Linux && Windows)(1)

和朋友一起做课程设计,同时学习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

posted @ 2020-05-03 22:05  春告鳥  阅读(623)  评论(0编辑  收藏  举报