【网络编程开发】16.域名解析与http服务器实现原理

16.域名解析与http服务器实现原理

文章目录

  • 16.域名解析与http服务器实现原理
    • gethostbyname 函数
    • HTTP的操作过程
    • 实现http
      • home.html
      • http-head.txt
      • server.c

gethostbyname 函数

  1. 原型

    #include <netdb.h>
    struct hostent *gethostbyname(const char *hostname);
    
  2. 功能:获取主机名对应的IP地址

  3. 参数hostname:要查询的主机名。

  4. 返回值

    • 成功时,返回一个指向hostent结构的指针。
    • 失败时,返回NULL。
  5. 注意:使用完该函数后记得使用endhostent函数进行销毁,清理缓冲区。

  6. struct hostent

    • struct hostent {char  *h_name;  /* 官方域名 */char **h_aliases;  /* 别名*/int    h_addrtype;  /* 地址族(地址类型) */int    h_length;  /* 地址长度 */
      char **h_addr_list;  /* 地址列表 */
      }
      #define h_addr h_addr_list[0] /* 实现向后兼容性 */
      
    • h_name :主机的正式名称

    • h_aliases:主机的备用名称数组,以 NULL 结尾指针

    • h_addrtype:地址类型;(AF_INETAF_INET6

    • h_length:地址的长度(以字节为单位)

    • h_addr_list:指向主机网络地址的指针数组(按网络字节顺序),由 NULL 指针终止

    • h_addr h_addr_list:中的第一个地址,以实现向后兼容性

  7. 示例

    #include <stdio.h>
    #include <netdb.h>
    #include <sys/socket.h>
    #include <stdlib.h>
    #include <arpa/inet.h>int main(int argc, char *argv[])
    {int i;
    /*检查参数*/if(argc < 2){printf("%s <host name>\n", argv[0]);exit(0);}
    /*将域名赋值给结构体*/struct hostent *host = gethostbyname(argv[1]);/*打印结构体的内容*/for(i = 0; host->h_aliases[i] != NULL; i++){printf("%s\n", host->h_aliases[i]);}printf("Address type:%s\n",host->h_addrtype == AF_INET ? "AF_INET":"AF_INET6");for(i = 0; host->h_addr_list[i] != NULL; i++){printf("IP address %d:%s\n", i, inet_ntoa(*(struct in_addr *)host->h_addr_list[i]));}endhostent();//关闭主机信息文件return 0;
    }
    

    运行程序:./test www.baidu.com

    在这里插入图片描述

HTTP的操作过程

在这里插入图片描述

  1. DNS解析:当用户在浏览器中输入URL或点击链接时,浏览器首先需要将域名转换为对应的IP地址。这一过程称为DNS解析。浏览器会向DNS服务器查询该域名对应的IP地址。
  2. 建立TCP连接:获取到IP地址后,浏览器会与服务器建立TCP连接,这一过程涉及到TCP协议的三次握手。这是为了确保数据能够准确、有序地在网络中传输。
  3. 封装HTTP请求数据包:一旦TCP连接建立成功,浏览器会封装一个HTTP请求数据包,其中包含了请求行、请求头和请求体等信息。
  4. 发送HTTP请求:随后,浏览器通过已经建立的TCP连接,向服务器发送HTTP请求。这个请求可能包含对网页文档的请求,或是对图片、CSS、JavaScript等资源的请求。
  5. 服务器处理请求:服务器接收到HTTP请求后,会根据请求的内容进行处理。这包括读取请求的资源、执行相应的脚本等操作。
  6. 服务器返回响应:处理完请求后,服务器会返回一个HTTP响应,其中包括了状态码、响应头和响应体等信息。状态码告诉客户端请求是否成功,或者遇到了何种错误。
  7. 浏览器解析HTML:收到响应后,浏览器开始解析HTML代码,并构建DOM树。同时,浏览器会根据HTML中的标签和属性,请求必要的资源文件,如CSS样式表、JavaScript脚本以及图片等。
  8. 浏览器渲染页面:在取得并解析所有资源文件后,浏览器开始渲染页面。这个过程包括计算每个元素的位置和样式,最终将页面呈现出来。
  9. 关闭TCP连接:一旦服务器发送了请求的数据,通常会主动关闭TCP连接。但在某些情况下,如果响应头信息中包含Connection:keep-alive,则连接仍然保持打开状态,以便后续在同一连接上发送更多请求

实现http

home.html

<html>
<head>
<title>server name</title>
<meta charset="utf-8">
</head>
<body>
<body>
<h1>文档标题</h1>
<p>Hello World!</p>
</body>
</body>
</html>

http-head.txt

HTTP/1.1 200 OK
Content-Type: text/html
Connection: close

server.c

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <strings.h>#define PORT 80
#define BACKLOG 5
#define HTTPFILE "http-head.txt"
#define HTMLFILE "home.html"int ClientHandle(int newfd);int main(int argc, char *argv[])
{int fd, newfd;struct sockaddr_in addr;/*创建套接字*/fd = socket(AF_INET, SOCK_STREAM, 0);if(fd < 0){perror("socket");exit(0);}int opt = 1;if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void *) &opt, sizeof(opt) ))perror("setsockopt");addr.sin_family = AF_INET;addr.sin_port = htons(PORT);addr.sin_addr.s_addr = 0;/*绑定通信结构体*/if(bind(fd, (struct sockaddr *)&addr, sizeof(addr) ) == -1){perror("bind");exit(0);}/*设置套接字为监听模式*/if(listen(fd, BACKLOG) == -1){perror("listen");exit(0);}/*接受客户端的连接请求,生成新的用于和客户端通信的套接字*/newfd = accept(fd, NULL, NULL);if(newfd < 0){perror("accept");exit(0);}ClientHandle(newfd);close(fd);return 0;
}int ClientHandle(int newfd){int file_fd = -1;char buf[BUFSIZ] = {};int ret;
/*接收数据*/do {ret = recv(newfd, buf, BUFSIZ, 0);}while(ret < 0 && errno == EINTR);//如果接收到的数据个数小于0,或者错误为非阻塞时未收到数据的标志EINTRif(ret < 0){perror("recv");exit(0);}else if(ret == 0){//客户端主动结束close(newfd);return 0;}else{printf("=====================================\n");printf("%s", buf);fflush(stdout);//刷新缓冲区}/*读取文件HTTPFILE的内容并发送*/bzero(buf, ret);file_fd = open(HTTPFILE, O_RDONLY);if(file_fd < 0){perror("open");exit(0);}ret = read(file_fd, buf, BUFSIZ);printf("%s\n", buf);send(newfd, buf, ret, 0);close(file_fd);/*读取文件HTMLFILE的内容并发送*/bzero(buf, ret);file_fd = open(HTMLFILE, O_RDONLY);if(file_fd < 0){perror("open");exit(0);}ret = read(file_fd, buf, BUFSIZ);printf("%s\n", buf);send(newfd, buf, ret, 0);close(file_fd);close(newfd);return 0;
}
  1. 查看ip地址 ifconfig
    在这里插入图片描述

  2. 运行程序 sudo ./server

  3. 打开浏览器输入ip地址

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/29693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技巧|手机上看SwanLab实验的两种方法

什么是SwanLab? SwanLab是一个深度学习实验管理与训练可视化工具&#xff0c;由西安电子科技大学创业团队打造&#xff0c;融合了Weights & Biases与Tensorboard的特点&#xff0c;可以记录整个实验的超参数、指标、训练环境、Python版本等&#xff0c;并可视化图表&…

Java代码运行的原理

Java的运行原理主要涉及编译、类加载、字节码执行和垃圾回收。以下是Java代码的运行流程和关键组件的详细解释&#xff1a; 1. 编写代码 开发者使用文本编辑器或IDE编写Java源代码&#xff0c;文件扩展名为.java。例如&#xff1a; public class HelloWorld {public static …

google chrome浏览器安装crx插件Jam

先上一张图&#xff1a; Jam是bug报告生成插件 1、在地址栏中输入chrome://extensions/&#xff0c;然后回车。 2、将下载好的crx插件&#xff0c;直接拖到里面就可以完成安装工作了。 3、测试了一下jam插件&#xff0c;发现直接没有响应。 4、点击【移除】直接可以删除插件…

C++ 子集合枚举

给定一个正整数数组 nums[], 求所有可能的组合&#xff0c;使得组合中的元素和等于target, 例如: nums 为 {3, 4, 5}, target 为 9, 解为 {3, 3, 3}, {4, 5} #include <algorithm> #include <memory> #include <string> #include <vector> #include…

这四个有意思的工具,很香

提醒英雄 提醒英雄应用是一款能够帮助用户彻底解决健忘症的应用程序。该应用创建的事项会完全同步到通知中心&#xff0c;并且持续保持在锁屏界面上&#xff0c;只要打开手机&#xff0c;用户就会看到之前设置的提醒事项。这种设计确保了用户在任何时候都能及时收到提醒&#…

YOLOv10改进 | 注意力篇 | YOLOv10引入Polarized Self-Attention注意力机制

1. Polarized Self-Attention介绍 1.1 摘要:像素级回归可能是细粒度计算机视觉任务中最常见的问题,例如估计关键点热图和分割掩模。 这些回归问题非常具有挑战性,特别是因为它们需要在低计算开销的情况下对高分辨率输入/输出的长期依赖性进行建模,以估计高度非线性的像素语…

uniapp——微信扫码进入小程序、H5页面,获取数据

进入小程序 微信调起扫一扫&#xff0c;扫描一个二维码码进入小程序 【http://www.love.com/?id20】 onLoad((options) > {if (options.q) {let url decodeURIComponent(options.q)id.value i.getUrlKey(id, url)getDetails()return} })进入H5 微信调起扫一扫&#xf…

【ARMv8/ARMv9 硬件加速系列 2.3 -- ARM NEON 的四舍五入指令】

文章目录 NEON 的四舍五入SRSHLR 指令格式SRSHLR 操作说明SRSHLR 示例解释NEON 的四舍五入 SRSHR指令是ARMv8 NEON SIMD指令集中的一部分,用于对向量中的每个元素进行向右的算术位移操作,并将结果四舍五入。SRSHR指令的全称是Signed Rounding Shift Right,适用于带符号的整…

JavaFX DatePicker

JavaFX DatePicker允许从给定日历中选择一天。DatePicker控件包含一个带有日期字段和日期选择器的组合框。JavaFX DatePicker控件使用JDK8日期时间API。 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.DatePicker; import j…

基础语法总结 —— Python篇

1、环境搭建 建议直接安装 PyCharm &#xff08;Community Edition&#xff09; Python3.x版本&#xff0c;前者是一个很好用的编译器&#xff0c;后者是Python的运行环境之类的&#xff0c;安装参考https://mp.csdn.net/mp_blog/creation/editor/139511640 2、标识符 第一个…

AWS无服务器 应用程序开发—第十二章 AWS Step Functions

AWS Step Functions 是一种服务,用于协调和管理分布式应用程序中的多个 AWS 服务和 Lambda 函数。它通过创建有状态的工作流来简化和自动化应用程序的各种工作流程,使得复杂的业务逻辑可以以可管理和可调试的方式实现。 主要功能和特点: 状态机定义: 使用 JSON 或 Amazo…

Django与Flask的区别:从开发者视角的深度探讨

Django与Flask的区别&#xff1a;从开发者视角的深度探讨 在现代Web开发中&#xff0c;Python的两大热门框架Django和Flask&#xff0c;常常引起开发者的热烈讨论。作为一个在Python生态系统中进行Web开发的技术员&#xff0c;选择适合的框架至关重要。今天&#xff0c;我将从…

004-配置交换机ssh远程登录

配置交换机ssh远程登录 注意事项 要远程的本机电脑必须与该交换机在同一个网段&#xff0c;以下实验在172.16.12段下模拟&#xff0c;本地ip设置为172.16.12.10&#xff0c;交换机的ip设置为172.16.12.254 将密码设置为明文&#xff08;simple&#xff09;是不安全的&#x…

MindSpore Transformers套件教程

MindSpore Transformers套件教程 项目地址&#xff1a;https://gitee.com/mindspore/mindformers 一、介绍 MindSpore Transformers套件的目标是构建一个大模型训练、微调、评估、推理、部署的全流程开发套件&#xff0c;提供业内主流的Transformer类预训练模型和SOTA下游任…

C++实时检测耳机的插入与拔出(附源码)

目录 1、实现继承于IMMNotificationClient接口类的CMMNotificationClient类,实时感知音频设备变化的通知事件 2、在CMMNotificationClient的构造函数中初始化多媒体设备COM接口,设置回调类指针 3、通过获取音频设备接口下外设的KSJACK_DESCRIPTION 信息判断耳机的连接状态…

猫头虎分享已解决Bug || 前端领域技术问题解析

原创作者&#xff1a; 猫头虎 作者微信号&#xff1a; Libin9iOak 作者公众号&#xff1a; 猫头虎技术团队 更新日期&#xff1a; 2024年6月6日 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &…

从老花眼开始

三年前&#xff0c;博主的的火眼金睛开始老花了&#xff0c;表现就是看近处看不清了。人眼对可视距离的标准可以定义为&#xff1a;看手机为近距离&#xff0c;看电脑为中距离&#xff0c;看电视为中距离&#xff0c;看红绿灯为远距离。老花眼就是戴近视眼镜直接看手机看不清了…

聆思CSK6大模型+AI交互多模态开源SDK介绍

视觉语音大模型 AI 开发套件( CSK6-MIX )是围绕 CSK6011A 芯片设计的具备丰富语音图像功能与硬件外设的开发板&#xff0c;采用具备丰富组件生态的 Zephyr RTOS作为操作系统&#xff0c;官方提供了十几种开源SDK&#xff0c;包含大模型语音交互、大模型拍照识图、文生图、人脸识…

2024年危化品生产经营单位考试试题。

16.在生产经营单位的安全生产工作中,最基本的安全管理制度是&#xff08; &#xff09;。 A.安全生产目标管理制 B.安全生产奖励制度 C.安全生产责任制 答案:C 17.在劳动过程、生产过程和生产环境中存在的危害劳动者健康的因素,称为&#xff08; &#xff09;。 A.职业病…

如何在不同的操作系统中查看路由器的IP地址?这里有详细步骤

如果你曾经需要访问路由器的设置页面来进行一些配置更改,你知道你需要路由器的IP地址才能访问。如果你忘记了这个IP地址是什么,下面是如何在几乎所有平台上找到它的。 为什么路由器的IP很有用 在网络世界中,默认网关是一个IP地址,当流量被发送到当前网络之外的目的地时,…