和朋友一起做课程设计,同时学习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. Sentinel 的一些小扩展

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统自适应保护等多个维度来帮助您保障微服务的稳定 ...

  2. Mongodb和Hbase的对比

    Mongodb和Hbase的对比 1.Mongodb bson文档型数据库,整个数据都存在磁盘中,hbase是列式数据库,集群部署时每个familycolumn保存在单独的hdfs文件中. 2.Mon ...

  3. Js中函数声明和函数表达式的区别

    先看以下几段烧脑的代码: f();//=>? var f = function () { console.log("var"); } function f() { conso ...

  4. PF_PACKET&&tcpdump

    linux下抓包原理 linux下的抓包是通过注册一种虚拟的底层网络协议来完成对网络设备消息的处理权.当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,当抓包模块把自己伪装成一个网络 ...

  5. 1. 线性DP 53. 最大子序和.

    53. 最大子序和. https://leetcode-cn.com/problems/maximum-subarray/ func maxSubArray(nums []int) int { dp ...

  6. MySQL_where和having的区别

    1. where和having都可以使用的场景 select goods_price,goods_name from sw_goods where goods_price > 100 selec ...

  7. Xpath定位元素-一个例子

    前几天在群里面解决的问题,记录下来和大家分享 需要定位这个股份制企业 方法: # 首先需要单击下拉框弹出企业性质的下拉选项:然后用过Xpath定位元素 driver.find.element_by_c ...

  8. USACO 2020 OPEN Favorite Colors【并查集-启发式合并-思考】

    题目链接 题意简述 仰慕喜欢同色奶牛的奶牛喜欢同色 (禁止套娃 ,求一种方案,奶牛喜欢的颜色种数最多,多种方案求字典序最小. 题目解析 这道题我最先想到的居然是二分+并查集,我在想啥 咳咳 首先,考虑 ...

  9. html 小米商城导航栏示例

    1.小米导航栏示例 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...

  10. 玩转百度地图API(地图,坐标,标记,添加控件,2D图,混合图,智能搜索,地址解析器,信息窗口)

    1.注册得到appkey 2.直接上代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Conte ...