l8-d21 域名解析与http服务器实现原理

news2024/11/25 11:28:07

一、域名解析gethostbyname函数

主机结构在 <netdb.h> 中定义如下:

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:中的第一个地址,以实现向后兼容性

二、万维网服务器的实现原理

三、实现

 

#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);    //如果因为连接错误导致错误,再读一次
	if(ret < 0){
		perror("recv");
		exit(0);
	}else if(ret == 0){
		close(newfd);
		return 0;
	}else{
		printf("=====================================\n");
		printf("%s", buf);
		fflush(stdout);
	}

	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);

	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;
}

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

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

相关文章

[JAVAee]SpringBoot配置文件

配置文件的介绍 配置文件当中记录了许多重要的配置信息,例如: 数据库的连接信息(用户的账户与密码)项目的启动端口第三方系统的调用密匙用于记录问题产生的日志 在spring框架中一些特定的框架会自动调用配置文件中的配置信息来运用. 配置文件中的属性也起到了类似全局变量的…

基于ROS环境的相机标定教程

一、参考资料 ROS学习——利用电脑相机标定 二、安装usb_cam驱动包 usb_cam - ROS Wiki GitHub - ros-drivers/usb_cam: A ROS Driver for V4L USB Cameras usb_cam包用于读取图像。 1. 源码安装usb_cam usb_cam用于实时SLAM&#xff0c;配合ROS平台使用。 1.1 下载usb_…

【Linux初阶】信号入门 | 信号基本概念+信号产生+核心转储

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;Linux信号的基本概念&#xff08;生活信号、技术信号、信号生命周期、信号的保存位置和发送本质&#xff09;&…

Pytorch-MLP-CIFAR10

文章目录 model.pymain.py参数设置注意事项运行图 model.py import torch.nn as nn import torch.nn.functional as F import torch.nn.init as initclass MLP_cls(nn.Module):def __init__(self,in_dim3*32*32):super(MLP_cls,self).__init__()self.lin1 nn.Linear(in_dim,1…

RFID自动识别技术在数控工具系统的应用

RFID是一种自动识别技术&#xff0c;最早是应用在二战中进行敌我侦察机的识别&#xff0c;但是随着民用通信技术的放开&#xff0c;近年来网络通信技术以及信息安全技术都取得了重大的发展&#xff0c;RFID技术也逐渐在民用领域应用。 RFID自动识别技术在数控工具系统的应用 1、…

浅谈PDM与MES系统集成

摘要&#xff1a; 目前MES在制造行业变得炙手可热&#xff0c;然而很多企业都忽视了数据的源头&#xff0c;MES作为生产执行的信息化系统&#xff0c;我们该如何让其在企业中成功的实施&#xff0c;发挥更大的作用&#xff0c;这还需要PDM系统的支撑。本文就PDM与MES集成进行简…

css前端面试题(三)

文章目录 1、可继承属性和不可继承属性字体系列属性文本系列属性元素可见性列表布局属性光标属性 2、link和import的区别3、css优化4、 CSS预处理器/后处理器是什么&#xff1f;为什么要使用它们&#xff1f;5、单行、多行文本溢出隐藏6、实现一个扇形7、实现一个自适应的正方形…

【Axure高保真原型】人物卡片多条件搜索案例

今天和大家分享人物卡片多条件搜索的原型模板&#xff0c;我们可以输入姓名或者选择部门、岗位来快速筛选出对应的人物信息卡片。那这个模板是用中继器制作的&#xff0c;所以使用也很方便&#xff0c;只需要在中继器表格导入图片和填写对应内容&#xff0c;即可自动生成交互效…

1600*A. LCM Challenge(数论 || 找规律)

解析&#xff1a; n<3&#xff0c;特判 n为奇数&#xff0c;则n、n-1、n-2必定互质&#xff0c;所以结果即为三者之和。 n为偶数&#xff0c; 不会严格证明原因&#xff0c;但是找找规律&#xff0c;是这样的...... #include<bits/stdc.h> using namespace std; #de…

ros----发布者和订阅者模型

话题模型&#xff1a; 如何自定义话题消息 1.定义msg文件 2.在package.xml中添加功能包依赖 <build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>3.在CMakeList.txt文件中添加编译选项 4.编译生成语言的相…

网络工程师是干什么的?常见岗位有哪些?

网络工程师是做什么工作&#xff1f; 网络工程师能够从事计算机信息系统的设计、建设、运行和维护工作。一般来说&#xff0c;分硬件网络工程师和软件网络工程师两大类&#xff0c;硬件网络工程师以负责网络硬件等物理设备的维护和通信&#xff1b;软件网络工程师负责系统软件…

LeetCode(力扣)509. 斐波那契数Python

LeetCode509. 斐波那契数 题目链接代码 题目链接 https://leetcode.cn/problems/fibonacci-number/ 代码 class Solution:def fib(self, n: int) -> int:if n 0:return 0dp [0] * (n 1)dp[0] 0dp[1] 1for i in range(2, n 1):dp[i] dp[i - 1] dp[i - 2]return d…

IM即时通讯系统[SpringBoot+Netty]——梳理(总)

文章目录 一、为什么要自研一套即时通讯系统1、实现一个即时通讯系统有哪些方式1.1、使用开源产品做二次开发或直接使用1.2、使用付费的云服务商1.3、自研 2、如何自研一套即时通讯系统2.1、早期即时通讯系统是如何实现2.2、一套即时通讯系统的基本组成2.3、当下的即时通讯系统…

【milkv】st7735驱动

前言 本文介绍milkv-duo加载st7735的lcd屏幕&#xff0c;以及屏幕显示log。 参考文章&#xff1a; 记录为Linux配置spi屏幕&#xff08;st7735s&#xff09; https://community.milkv.io/t/milk-v-duo-spi-st7789/131 一、电路图 1.1 pin设置 打开spi2的引脚 duo-buildroot…

@Transactional失效场景/原因

文章目录 1.Transactional注解在非public方法上2.Transactional使用propagation设置错误&#xff08;有3种会失效&#xff09;3.Transactional使用rollbackFor设置错误4.A方法没有使用Transactional调用了B&#xff08;有被注解&#xff09;方法5.try catch了异常6.数据库引擎不…

AI绘制流程图

1、工具&#xff1a; 使用https://chat.openai.com/c/45a81a53-cced-43f7-be3e-e5e80f1e994fFlowchart Maker & Online Diagram Software 2、使用plantuml的过程&#xff1a; 复制代码&#xff0c;打开diagram.net&#xff0c;点击加号→高级→ plantUML&#xff0c;替换掉…

已解决 Go Error: cannot use str (type string) as type int in assignment

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

【openKylin】OpenKylin1.0 x86_64 VMWare安装手册

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1f338;文…

华为云ROMA Connect亮相Gartner®全球应用创新及商业解决方案峰会,助力企业应用集成和数字化转型

9月13日-9月14日 Gartner全球应用创新及商业解决方案峰会在伦敦举行 本届峰会以“重塑软件交付&#xff0c;驱动业务价值”为主题&#xff0c;全球1000多位业内专家交流最新的企业应用、软件工程、解决方案架构、集成与自动化、API等企业IT战略和新兴技术热门话题。 9月13日…

【结构体类型——详细讲解】

结构体 1.结构体类型声明 1.1结构体的概念 结构体是⼀些值的集合&#xff0c;这些值称为成员变量。结构体的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag { member-list; }variable-list;例如描述⼀个学⽣&#xff1a; struct Stu { char name[20]; //名字 i…