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

C语言网络编程(Linux && Windows)(1)的更多相关文章

  1. 11. Go 语言网络编程

    Go 语言网络编程 Go语言在编写 web 应用方面非常得力.因为目前它还没有 GUI(Graphic User Interface 图形化用户界面)的框架,通过文本或者模板展现的 html 界面是目 ...

  2. 《Go语言网络编程》第一章:体系

    原书地址:http://tumregels.github.io/Network-Programming-with-Go 如果不知道想要构建什么,是不可能创建一个系统的.而且如果不知道它工作的环境,也同 ...

  3. Linux C语言 网络编程(二) server模型

    前面介绍了关于连接linux服务端方式,可是服务端的资源是有限的,所以我们通常须要又一次思考,设计一套server模型来处理相应的client的请求. 第一种:并发server.通过主进程统一处理cl ...

  4. GO语言网络编程

    socket编程 Socket是BSD UNIX的进程通信机制,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.Socket可以理解为TCP/IP网络的API,它 ...

  5. 【网络编程】——windows socket 编程

    测试demo #include <winsock2.h> #include <stdio.h> #include <string.h> #include <s ...

  6. C语言socket编程——linux环境

    先写一个服务器端的监听程序,功能室从客户端读取字符,接收到后告知客户端“I got your message: ”+收到的消息:server.c #include <stdio.h> #i ...

  7. 网络编程 — Linux TCP服务端和客户端

    1. 服务端 #include <stdlib.h> #include <string.h> #include <errno.h> #include <sig ...

  8. Linux下TCP网络编程与基于Windows下C#socket编程间通信

    一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...

  9. Windows网络编程(C/C++服务器编程)

    Windows服务器网络编程 Linux服务器网络编程

随机推荐

  1. php 上传音频文件并获取时长

    <input type="file" name="audio" id="voice_file" style="display ...

  2. C#调用pyd

    python打包成pyd在本篇博客不多叙述,请读者自行百度,本篇博客主要讲解在C#中如何调用pyd以及遇到的一些问题如何解决. 1.安装pythonnet pythonnet是一个强大的工具包,用于C ...

  3. GSO和TSO

    http://www.cnhalo.net/2016/09/13/linux-tcp-gso-tso/ TSO(TCP Segmentation Offload): 是一种利用网卡来对大数据包进行自动 ...

  4. python pip install指定国内源镜像

    有时候安装一些依赖包,网不好,直接超时,或者这个包就是死都下不下来的时候,可以指定国内源镜像. pip install -i 国内镜像地址 包名 e.g. pip install -i  http:/ ...

  5. 新同事不讲“码”德,这SQL写得太野了,请耗子尾汁~

    今天来分享几个MySQL常见的SQL错误(不当)用法.我们在作为一个初学者时,很有可能自己在写SQL时也没有注意到这些问题,导致写出来的SQL语句效率低下,所以我们也可以自省自检一下. 1. LIMI ...

  6. 痞子衡嵌入式:揭秘i.MXRT600的ISP模式下用J-Link连接后PC总是停在0x1c04a的原因(Debug Mailbox)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT600中的Debug Mailbox实现对JLink调试的影响. 事情缘起痞子衡的同事 - 喜欢打破砂锅问到底的Kerry小 ...

  7. pdfFactory如何设置限制打印和浏览文档权限

    当我们进行私密文件的分享时,除了要设置密码保护文件内容外,还要注意设置打印限制,防止他人利用打印的方式,进行纸质文件的传播. 在使用pdfFactory安全策略时,我们可以通过设定禁止打印的方式,完全 ...

  8. ubuntu安装imagick扩展

    注意:安装该扩展不要求安装ImageMagick从http://pecl.php.net/package/imagick找到imagick的最新的版本 Linux代码 wget http://pecl ...

  9. ResNet模型

    ReeNet论文地址:Deep Residual Learning for Image Recognition Resnet的两种不同结构 上图左边的结构主要是针对深度较少的网络,当深度较大时则用右边 ...

  10. leetcode165. 比较版本号

    比较两个版本号 version1 和 version2.如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0 ...