C语言网络编程(Linux && Windows)(1)
和朋友一起做课程设计,同时学习C语言的网络编程,以前写的都是python网络编程,但python很多的库都是封装好的,大部分人在使用的时候不会去了解底层的实现,这样对长远的学习不太好,也改正自己这方面的依赖。
想要把大象放进冰箱分为三步:第一步,把冰箱门打开,第二步,把大象放进去,第三步,关上冰箱门。
我们同样把这道题目也分解:第一步,将输入的url转换成IP地址,第二步,访问IP地址,HTTP协议默认是80端口,第三步,获取题目中我们需要的信息,跟python爬虫类似,第四步,将程序可视化,打包成exe文件。
样例程序最终样子为:
或者这样
先进行第一步:将输入的域名转换成IP地址
其实在写的时候可以想到,如果目标站点使用的CDN的话,我们是不能获取到真实IP地址的,不过我们也不是为了获取真实IP,只要能拿到返回信息就行了。
使用gethostbyname() 函数可以完成域名到IP地址的转换
它的原型为:
1 | struct hostent *gethostbyname( const char *hostname); |
hostname 为主机名,也就是域名。使用该函数时,只要传递域名字符串,就会返回域名对应的IP地址。返回的地址信息会装入 hostent 结构体,该结构体的定义如下:
1 2 3 4 5 6 7 | 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的结构体,其结构体内部存在五个成员,其具体信息为:
1 2 3 4 5 | 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地址给同一域名,利用多个服务器进行均衡负载。 |
我们可以根据我们的需要取返回结构体中的成员,这里我们用到的是
1 | h_addr_list |
注意,可能返回的不止一个IP地址,所以我们需要使用一个循环输出所有的IP地址
在写代码之前我们先把环境配置好
在windows环境下,使用的库文件是:
1 | #include <winsock2.h> |
在Linux环境下,使用的库文件是:
1 | #include <netdb.h> |
我这里使用的是Ubuntu环境编写的该代码,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #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语言源代码:
1 | $ gcc -o gethostbyname gethostbyname.c |
编译之后运行:
1 | . /gethostbyname |
可以看到成功输出的www.baidu.com对应的IP地址,完成了第一步代码的编写。
参考链接:
http://c.biancheng.net/cpp/html/3048.html
https://blog.csdn.net/qq_19004627/article/details/84784815
__EOF__

本文链接:https://www.cnblogs.com/Cl0ud/p/12823829.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!