C语言网络编程(3)— 通过DNS连接到百度

2023-05-16

C语言网络编程(3)— 通过DNS连接到百度

一、gethostbyname()函数

我们现在认知一台计算机主机通常采用直观可读的名字。例如百度我们会记住 www.baidu.com 而不是他的IP地址。对于大多数的应用程序来说应该是处理名字而不是处理地址。如果说对于一个点分十进制来说还好记住,那么当使用IPv6时,IP地址就不是那么好记了。
  而Linux下的函数 gethostbyname是查找主机名最基本的函数。如果调用成功,它就返回一个指向hostent结构的指针,该结构中含有所查找主机的所有IPv4地址。
函数原型如下:

struct hostent *gethostbyname(const char *name);

调用成功返回hostent结构体的指针,hostent结构体如下

struct hostent {
		char  *h_name;            /* 正式的主机名 */
		char **h_aliases;         /* 主机别名列表 */
		int    h_addrtype;        /* 地址类型,AF_INET->IPv4, AF_INET6->IPv6 */
		int    h_length;          /* 地址长度,单位为字节 */
		char **h_addr_list;       /* 地址对应的所有IP地址列表 */
	}

注:一个地址有多个IP对应,比如一个大型网站可能南方,北方,国外等不同的地方都有主机,总之是很多情况,需要多个IP。

二、编程获取百度的IP地址

要使用gethostbyname()函数则需要导入头文件:

#include <netdb.h>

我们直接使用gethostbyname()获取百度域名的信息

	// 1、使用gethostbyname()获取百度域名的信息
    struct hostent *host_ptr = gethostbyname("www.baidu.com");

然后将消息打印出来

    // 2、打印百度域名的信息
    printf("official name:%s \n",host_ptr->h_name);             // 正式的主机名
    for(i=0; host_ptr->h_aliases[i] != NULL; i++)               // 别名
        printf("alias name   :%s \n",host_ptr->h_aliases[i]);
    // 地址类型,AF_INET->IPv4, AF_INET6->IPv6 
    printf("address type :%s \n",host_ptr->h_addrtype == AF_INET ?"IPv4":"IPv6");
    for(i=0; host_ptr->h_addr_list[i] != NULL; i++)             // IP地址列表
        printf("addr %d       :%s \n",i, inet_ntoa( *(struct in_addr*)host_ptr->h_addr_list[i]));

编译,运行结果如下:
在这里插入图片描述
然后我们在终端使用ping命令,可以看到,我们同样得到了两个IP地址
在这里插入图片描述

三、连接百度服务器

尝试连接到百度服务器

	// 3、使用socket()函数获取一个TCP客户端socket文件描述符
	int tcp_client = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == tcp_client)
	{
		perror("socket");
		return -1;
	}

    // 4、百度服务端的IP地址和端口,使用第一个ip地址,端口号80
    struct sockaddr_in server_addr = {0};	
	server_addr.sin_family = AF_INET;                                       // 设置地址族为IPv4
	server_addr.sin_port = htons(80);						                // 设置地址的端口号信息
	server_addr.sin_addr.s_addr = *(in_addr_t*)host_ptr->h_addr_list[0];	// 设置IP地址

    // 5、链接到服务器
    ret = connect(tcp_client, (const struct sockaddr *)&server_addr, sizeof(server_addr));
    if (ret < 0)
		perror("connect");
    else
	    printf("connect result, ret = %d.\n", ret);

连接成功:
在这里插入图片描述
然后发送一个GET请求,

    // 6. 发送GET请求
	char sendbuf[]={"GET / HTTP/1.1\n\n"};
	ret = send(tcp_client, sendbuf, strlen(sendbuf),0);

    // 7、等待接收服务端发送过来的数据,最大接收1024个字节
    char recvbuf[1024] = {0};
    ret = recv(tcp_client, recvbuf, sizeof(recvbuf), 0);

    // 8、将接收到的数据打印出来
    printf("Recvdate: \n%s \n",recvbuf);

编译,运行,访问成功
在这里插入图片描述
四、代码

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>

int main(void)
{
    int ret,i=0;
    // 1、使用gethostbyname()获取百度域名的信息
    struct hostent *host_ptr = gethostbyname("www.baidu.com");
    //struct hostent *host_ptr = gethostbyname("www.163.com");//http://www.hfut.edu.cn/

    // 2、打印百度域名的信息
    printf("official name:%s \n",host_ptr->h_name);             // 正式的主机名
    for(i=0; host_ptr->h_aliases[i] != NULL; i++)               // 别名
        printf("alias name   :%s \n",host_ptr->h_aliases[i]);
    // 地址类型,AF_INET->IPv4, AF_INET6->IPv6 
    printf("address type :%s \n",host_ptr->h_addrtype == AF_INET ?"IPv4":"IPv6");
    for(i=0; host_ptr->h_addr_list[i] != NULL; i++)             // IP地址列表
        printf("addr %d       :%s \n",i, inet_ntoa( *(struct in_addr*)host_ptr->h_addr_list[i]));

    // 3、使用socket()函数获取一个TCP客户端socket文件描述符
	int tcp_client = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == tcp_client)
	{
		perror("socket");
		return -1;
	}

    // 4、百度服务端的IP地址和端口,使用第一个ip地址,端口号80
    struct sockaddr_in server_addr = {0};	
	server_addr.sin_family = AF_INET;                                       // 设置地址族为IPv4
	server_addr.sin_port = htons(80);						                // 设置地址的端口号信息
	server_addr.sin_addr.s_addr = *(in_addr_t*)host_ptr->h_addr_list[0];	// 设置IP地址

    // 5、链接到服务器
    ret = connect(tcp_client, (const struct sockaddr *)&server_addr, sizeof(server_addr));
    if (ret < 0)
		perror("connect");
    else
	    printf("connect success.\n");

    // 6. 发送GET请求
	char sendbuf[]={"GET / HTTP/1.1\n\n"};
	ret = send(tcp_client, sendbuf, strlen(sendbuf),0);

    // 7、等待接收服务端发送过来的数据,最大接收1024个字节
    char recvbuf[1024] = {0};
    ret = recv(tcp_client, recvbuf, sizeof(recvbuf), 0);

    // 8、将接收到的数据打印出来
    printf("Recvdate: \n%s \n",recvbuf);

    // 9、关闭套接字
    close(tcp_client);
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言网络编程(3)— 通过DNS连接到百度 的相关文章

  • 如何在通过代理 (Tor) 浏览时阻止 Java 预解析我的主机?

    我目前正在开发一个java应用程序 它使用在本地主机上运行的tor代理来获取显示请求者ip的脚本 我希望这项工作主要由 Tor 代理完成 以便它在最 自然 的状态下工作 我当前的代码看起来与此类似 SocketAddress TorProx
  • 在 Android 上解析 DNS SRV 记录的轻量级方法

    在 Android 上进行 SRV 记录查找最节省资源的方法是什么 例如在 XMPP 客户端中 例如yaxim https github com pfleidi yaxim 我知道 JNDI http docs oracle com jav
  • 将 Google 域链接到 Amazon ec2 服务器

    我正在使用 Amazon EC2 实例来为 node js 应用程序提供服务 我最近通过以下方式购买了域名谷歌域名 https domains google com我想使用该域名来访问我的 node js 应用程序 Google Domai
  • 告诉 urllib2 使用自定义 DNS

    我想告诉urllib2 urlopen or a 定制开瓶器 使用127 0 0 1 or 1 来解析地址 我不会改变我的 etc resolv conf 然而 一种可能的解决方案是使用类似的工具dnspython查询地址和httplib构
  • 如何平衡Web服务器带宽使用?

    我有一个 drupal 商务网站 用户一直在其中上传大量图像 每个商业订单有 n 个图像 我想平衡网络流量以节省带宽 每个服务器的带宽是有限的 我无法使用传统的负载平衡解决方案 因为平衡器服务器的带宽也有限 我的数据库将位于单独的服务器上
  • 域名通过“dig”存在

    是否可以通过检查 dig 的输出来检查域名是否存在 在绑定源中我发现了这些常量 0 DNS R NOEROR 1 DNS R FORMERR 2 DNS R SERVFAIL 3 DNS R NXDOMAIN 4 DNS R NOTIMP
  • 对在欧盟地区运行的 Heroku 应用程序强制使用 SSL

    我正在努力为 Heroku 欧盟地区 上运行的 Rails 应用程序强制实施 SSL 连接 我已成功将证书 包括 Heroku SSL 附加组件 添加到自定义域 如果我明确声明 https com 则效果完美 但我想将所有 http 请求重
  • DHCP 服务器将任何 url 重定向到登陆页面

    我有一个 Linux DHCP 服务器 我需要将所有网络流量重定向到一个登陆页面 该页面将包含有关如何在网络上注册计算机的说明 无论用户输入什么 URL 都需要将用户重定向到网页 在 DHCP 服务器上 即 用户输入 google com
  • Java 无法从 AIX 解析 DNS 地址:UnknownHostException

    我遇到了这个奇怪的错误 在 AIX 上 如果我可以从命令行访问我的服务器 使用 ping telnet 但是如果我尝试使用 java 我会遇到 UnknownHostException 这是因为 Java 无法以某种方式 使用 DNS 但我
  • Docker DNS 设置

    我尝试使用自定义网络和 dos 设置创建 docker 容器 docker网络创建 driver bridge opt com docker network bridge enable ip masquerade true opt com
  • MongoDB:连接到 MongoDB 的 resolv.conf 的 DNS 问题

    我想从 MongoDB Atlas 导出一些数据 如果我执行下面的命令 它会尝试连接localhost并导出数据 mongoexport uri mongodb srv
  • 查询 dns 别名

    我找到了一些code http msdn microsoft com en us library system net dns gethostbyaddress VS 71 aspx来自 msdn 站点 下面包含代码 看起来它将返回给定服务
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 码头工人。将动态主机 IP 添加到容器上的环境变量

    我有一个非常特殊的场景 包含一些 docker 容器的虚拟机 该容器之一需要知道主机 IP 问题是如果我在容器构建时传递主机 IP 或使用 e在 docker run 命令上 它在容器上保持 静态 始终相同 那一刻 该虚拟机可以位于笔记本电
  • NameResolutionFailure 与 ConnectFailure 问题

    这是一个相当奇怪的问题 但仍然是一个非常糟糕的问题 当用户在没有互联网的情况下进入我们的应用程序时 我们会返回一个NameResolutionFailure作为尝试通过以下方式进行 API 调用的错误消息HttpClient 好吧 没关系
  • Heroku:无法解析服务器的 DNS

    我买了一个myapp app带有 OVH 的域 我还购买了 Heroku hobby dyno 以便为我的 api 有一个安全的子域 https www server myapp app代替https www myapp heroku ap
  • 跨域错误

    什么是跨域错误 当 Javascript 大多数时候 尝试访问不应该访问的内容 例如 如果您尝试读取另一个域的 cookie 那将不起作用 如果您尝试向另一个域或协议 HTTP gt HTTPS 发出 XMLHTTP 请求 则该请求将不起作
  • 在 grails 中使用 mockDomain 时如何覆盖方法的逻辑?

    我想像往常一样模拟一个域 mockDomain Class 但我想覆盖域的方法之一 beforeDelete具体来说 仅针对该单元测试使用自定义逻辑 如何才能实现这一目标 您可以使用 Groovy 元类重写域类上的 beforeDelete
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • CNAME 速度慢吗?

    我将 CNAME 与 S3 CloudFront 一起使用来提供一些静态文件 例如 js css 图像等 我这样做是为了使存储桶的 URL 更漂亮 因为我认为最好将所有内容都定位到我的网站 以防万一将来我想移动这些文件 更改应该是透明的 今

随机推荐

  • MPLAB构建项目报错“recipe for target ‘.build-conf‘ failed”

    recipe for target build conf failed 刚入门单片机 xff0c 在写程序时 xff0c 当时写完 xff0c build成功 xff0c 但是第二天过来 xff0c 改写了部分代码 xff0c 然后去bui
  • C/C++开发人员要了解的几大著名C/C++开源库

    目录 1 多媒体处理开源库FFmpeg 2 实时音视频处理开源库WebRTC 3 Chrome浏览器内核开源库Chromium 4 Chromium嵌入式框架开源库CEF 5 多协议网络传输开源库libcurl 6 开源操作系统ReactO
  • ADC转换值和实际电压的关系

    1 首先确定ADC用几位表示 xff0c 最大数值是多少 比如一个8位的ADC xff0c 最大值是0xFF xff0c 就是255 xff08 一般芯片手册会有说明 xff09 2 然后确定最大值时对应的参考电压值 一般而言最大值对应3
  • 程序设置波特率和串口调试助手波特率设置不同才能通信

    本人小白一个 xff0c 在根据教程去做串口通信时 xff0c 程序码完之后 xff0c 调试助手一直显示乱码 网络上查找原因 xff0c 得知是波特率不对 xff0c 当串口的波特率是38400 xff0c 程序上是115200时 xff
  • MPC574x平台学习——CAN通信

    前言 MPC574x是恩智浦公司出的一个系列的芯片 xff0c 本人所接触的主要是MPC5742 xff0c 最近在调试MPC5742的CAN通信 xff0c 使用S32自带的SDK生成CAN驱动 通过网络的教程去完成 xff0c 但是跟着
  • QT报错:error: static assertion failed: No Q_OBJECT in the class with the signal

    今天利用QT写一个项目 xff0c 在写代码的过程中 xff0c 使用到了QT中一大特色 信号和槽 xff0c 对这个也是刚刚学习阶段 xff0c 所以在这里遇到了一个问题 xff1a error static assertion fail
  • eclipse报错“Symbol could not be resolved”,但是编译没有问题

    Eclipse作为一个强大的编辑器 xff0c 可以用来做很多的工作 xff0c 在Eclipse中偶然遇到一个问题 Symbol could not be resolved xff0c 但是编译能够通过 xff1b 这个问题网上有很多人有
  • LCD屏幕调试过程(驱动IC ST7701s)

    调试准备工作 1 屏幕开发手册 xff1b 2 逻辑分析仪 xff08 用来捕获信号 xff0c 信号是否正确 xff09 xff1b 3 驱动板 xff0c 驱动屏幕显示 xff1b 屏幕接口 根据手册的说明 xff0c 可以知道屏幕的一
  • Ubuntu 18.04 安装Open3D C++版本

    此篇博客引用博客Ubuntu18 04 安装Open3D C 43 43 与Python版本 zpwhust的博客 CSDN博客 ubuntu 安装open3d 并在此基础上进行整理 环境 linux ubuntu 18 04 cmake
  • C++ 编译出现问题 -(undefined reference to `vtable for xxx‘)

    在编码遇到这个问题 xff0c 记录一下 xff0c 代码结构如下 class father father father class son public father son father son 乍一看 xff0c 没啥不对的 xff0
  • 实用工具合集

    工作中遇到的比较好用的网站 xff0c 记录一下 数学 1 3D Rotation converter 这是一个欧拉角 xff0c 旋转矩阵 xff0c 旋转向量相互转换的网站 2 坐标系 实时显示函数的一个网站 xff0c 功能强大 xf
  • Opencv3.2安装opencv_contrib-3.2

    在open3 x的版本中 xff0c 图像特征提取的算法并未在源码中 xff0c 需要从OpenCV contrib 3 2编译安装 xff0c 下面就是记录一下编译安装的过程 下载 opencv contrib 3 2下载地址 编译 cm
  • vector的成员函数解析

    vector是线性容器 它的元素严格的按照线性序列排序 和动态数组很相似 和数组一样 它的元素存储在一块连续的存储空间中 这也意味着我们不仅可以使用迭代器 iterator 访问元素 还可以使用指针的偏移方式访问 和常规数组不一样的是 ve
  • ROS编程遇到的错误小结

    1 终端出现MD5值不匹配问题 这种情况 xff0c 是由于通信双方的数据内容不同 持续更新
  • HTML 和 XML 数据的分析与解析

    引言 目前在 Java 中 xff0c 解析 HTML 工具主要包含以下几种 xff1a jsoup xff1a 强大的 HTML 解析工具 xff0c 支持以 jQuery 中 CSS Selector 的方式提取 HTML 中的元素 x
  • 【掌控板】0、基础教程

    环境搭建 软件 xff1a mind 43 硬件 xff1a 掌控板2 0 mind 43 使用界面 项目 新建项目 连接掌控板和pc 我的显示有问题 xff0c 是因为我原先代码出错了 xff0c 正常情况下会显示掌控板 驱动更新好了在m
  • 方波的产生——运算放大器LM324产生方波

    方波的产生 运算放大器LM324产生方波 双电源供电 xff08 1 xff09 搭建振荡电路如图所示 xff0c 先采用双电源供电讲解 xff0c 需要两个滑动变阻器RP1和RP2 xff0c 一个固定电阻R1和一个电容C1 xff0c
  • Android Studio开发手机APP(一)

    Day1 新建工程 软件安装可以参考Android第一天 安装Android Studio 3 5 一 打开Android Studio xff0c 新建工程 xff08 Android Studio版本 xff1a Version 3 5
  • 在Win10上使用Linux子系统和VSCode搭建C语言开发环境

    在Win10上使用Linux子系统和VSCode搭建C语言开发环境 一 启动Windows下的Linux子系统 打开控制面板 xff0c 点击卸载程序 点击右侧的 启用和关闭Windows功能 找到适用于Linux的Windows子系统 x
  • C语言网络编程(3)— 通过DNS连接到百度

    C语言网络编程 xff08 3 xff09 通过DNS连接到百度 一 gethostbyname 函数 我们现在认知一台计算机主机通常采用直观可读的名字 例如百度我们会记住 www baidu com 而不是他的IP地址 对于大多数的应用程