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连接到百度 的相关文章

  • DNS 在 PHP 中不工作(但一般情况下可以)

    以下脚本 返回 DNS 记录列表 但最终在 file get contents 上失败 尽管 phpinfo 说 allow url fopen On On allow url include Off 出现以下错误 PHP 消息 PHP 警
  • 如何确定c#中的dns变化?

    我想监控dns地址的变化 所以我需要跟踪 dns 更改 我现在正在用线程来做 我获取 dns 并将其保存为文件 然后每 10 秒比较一次它们 但我需要更具体的解决方案 例如 有相关活动吗 这是代码 GetDns public List
  • Mac OSX Lion DNS 查找顺序 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 升级到 Mac OSX Lion 后 我发现 etc hosts 不再首先查找名称解析 这会导致一些副作用 例如 etc hosts 中的条目解析速度
  • 为开发环境分配域名localhost

    我正在构建一个网站 并且不想将网站从指向重新配置为http 127 0 0 1 to http www example com 此外 我使用的证书当然是用正确的域名制作的www example com但我的测试环境会调用127 0 0 1这
  • 如何让您拥有的现有域指向 Azure 的服务器?

    默认情况下 Azure 网站 Web 应用程序的命名约定是somesubdomain cloudapp net and somesubdomain azurewebsites net 如果我有一个目前通过 GoDaddy 托管的现有网站 并
  • 在 Java 中检查名称服务器的 dns 查找

    给定一个域和一个名称服务器 IP 我想知道在 java 中解析 IP 的名称服务器在哪里 我怎样才能实现它 谢谢 您至少有两个选择 如果您的代码必须在任何 VM 上运行 则必须使用众多可用的 Java DNS 库之一 谷歌搜索 java d
  • 多个项目使用同一网络的 Docker DNS

    我有以下内容docker compose yml file version 3 services frontend image alpine command tail f dev null networks shared default b
  • 如何使用 Python 3.x 获取网站的 IP 地址?

    我有一个代表域名的字符串 如何使用Python 3 x获取对应的IP地址 像这样的东西 gt gt gt get ip http www stackoverflow com 64 34 119 12 gt gt gt import sock
  • PHP邮件、DNS请求超时、FQDN

    我要实现mail 我的 PHP 工作Windows Server 2012 R2 为此 我首先安装了SMTP依照指示这一页 http www vsysad com 2014 09 setup and configure smtp serve
  • Apache虚拟主机无域名

    我有一个安装了apache2的VPS 我想通过IP地址访问一些没有域名的PHP项目 例如 http 162 243 93 216 projecta index php http 162 243 93 216 projectb index p
  • 简单的域名正则表达式

    如何确保域名符合这 3 个简单标准 以 com net 结尾 不得以 http 或 https http www 或 https www 我已经设法理解了正则表达式的这一部分 它与第一个标准相对应 com net 但我不知道如何实现另外两个
  • Firebase 托管未验证 GoDaddy 中的 TXT 记录

    我部署了我的应用程序 现在我正在尝试添加我的自定义 URL 我按照 Firebase 的说明将他们的 TXT 记录添加到我的 DNS GoDaddy 中 但现在 Firebase 表示尚未得到验证 我认为我做错了什么 但这里没有什么可搞乱的
  • 每个域都有唯一的 IP 吗?

    我想知道每个域名地址是否都有唯一的IP地址 此外 这些IP位于哪里 这个重定向系统是如何工作的 当我们尝试通过写入域名来访问网站时 它有多少个重定向 谢谢 否 每个域没有自己的 IP 地址 多个域可以托管在同一台服务器上 并且位于同一 IP
  • 尝试使用 minikube 运行示例微服务应用程序时如何解决 DNS 查找错误

    亲爱的 StackOverflow 社区 我正在尝试运行https github com GoogleCloudPlatform microservices demo https github com GoogleCloudPlatform
  • 如何在 Windows 中拦截 DNS 查询

    我正在研究如何在 Windows 中拦截 DNS 查询 以一种不需要将 DLL 注入到每个进程中的方式 并且理想情况下能够根据发出查询的进程做出决策 因此简单的 DNS 代理服务器是不够的 从表面上看 DNS 查询所采用的路径如下所示 某些
  • 通过 HttpWebRequest 检索 URL 时,我可以看到目标服务器的 IP 地址吗?

    假设我正在检索一个网址 如下所示 string url http www somesite com somepage html HttpWebRequest req HttpWebRequest WebRequest Create url
  • C# Dns.GetHostEntry() - 异常:没有这样的主机已知

    From 文档 https learn microsoft com en us dotnet api system net dns gethostentry view netframework 4 8 Dns GetHostEntry 将主
  • NGinx 域名重定向

    假设我有一个名为 xyz co 的网站 我还有其他具有相同前缀的域名 例如 xyz com xyz it xyz co it 现在 nginx 与端口 80 的 nginx conf 中的 server name xyz co 配合得很好
  • 查询 dns 别名

    我找到了一些code http msdn microsoft com en us library system net dns gethostbyaddress VS 71 aspx来自 msdn 站点 下面包含代码 看起来它将返回给定服务
  • 为什么我的 Github 托管网站响应 HTTP 302 而不是 200?

    我拥有该域名penkov id au http penkov id au 我主持一个blog http michael penkov id au blog 2014 01 02 reinventing the wheel html usin

随机推荐

  • 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地址 对于大多数的应用程