zoukankan      html  css  js  c++  java
  • 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:
    ");
    	scanf("%s",hostname);
    	getchar();
    	host=gethostbyname(hostname);
    	if(host==NULL){
    		printf("%s not get ip,please check domain
    ",hostname);
    		exit(1);
    	}
    	printf("hostname is %s
    ",host->h_name);
    	for(i=0;host->h_addr_list[i];i++){	
    		printf("IP addr %d: %s 
    ",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

  • 相关阅读:
    jstl与el学习笔记
    Subversion 安装笔记
    某公司面试
    字符集与字符编码的一些小常识,以及java web中文乱码的一些solution
    分治算法与合并排序示例
    C/C++ 笔试,难倒我哉
    HTML meat作用
    VIM配置DBGp调试PHP程序
    更新系统引导项
    PHP技术讨论群
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/12823829.html
Copyright © 2011-2022 走看看