网络编程开发及实战(下)
一、IO模型
一、基本概念
(一)I/O基本概念
1、基本概念
1)一个完整I/O分为两个阶段:
用户进程空间->内核空间
内核空间->设备空间(磁盘、网卡)
2)内存I/O(无名管道)、网络I/O(UDP/TCP)、磁盘I/O(文件I/O)
2、同步和异步
1)不着急等待结果是异步aio_read
之前的程序read都是同步
2)同步经常用于线程内调用两个函数的调用
3)异步请求不知道的结果,后面可能通过别的机制来获得结果。
2、阻塞与非阻塞
3、阻塞状态不占有cpu,就绪态是等待cpu
4、线程阻塞的条件
1)自动sleep
2)i/o操作阻塞,等待返回
3)等待锁,获得锁
4)等待某个触发条件
5、阻塞套接字
服务端等待接收客户端,如果没有客户端,阻塞状态执行。
6、套接字:网络通信进程的一端
二、阻塞IO与非阻塞IO
1、五种IO
信号驱动式又名同步
2、全程阻塞,结束出来
套接字文件描述符默认是阻塞的。
recvfrom、read、accept、connect
3、非阻塞IO
一直返回,返回错误,知道有数据,返回成功
三、多路复用IO,信号驱动IO和异步IO
(一)多路复用模型
1、同时处理多个文件描述符
1)例:select可以同时监听多个文件描述符,都没有数据等待阻塞,有准备好的数据,recvfrom返回可读条件,多路复用的目的就是,哪个有数据,返回可读条件,系统调用
2)多路复用第一个阶段等待数据可阻塞可不阻塞,第二个阶段是以阻塞方式进行的。
3)阻塞肯定是同步的,异步不可能阻塞
2、信号驱动式IO
第一个阶段等待数据是异步的,只是注册了一个信号,没有发起读写,进程仍然可以执行其他。
第二个阶段是同步的
3、异步IO(了解)
第一阶段系统调用后直接返回,然后再内核中,准备数据,拷贝数据都是非阻塞的,拷贝完成重新发信号,此时没有IO操作了
四、五种IO模型的比较
二、IO多路复用select函数







三、多路复用poll函数
一、多路复用poll函数
1、多路复用
2、poll函数
第一个参数:复用的数组
第二个参数:顺序表的字段
第三个参数:ms
revents:系统返回
0:立刻返回,负数永久阻塞
二、poll的实现
四、套接字属性






五、广播和组播
一、广播及实现
1、ip地址分为网络号和主机号,主机号全为1的是广播地址
2、广播
1)广播只能用udp实现,tcp不行
2)255.255.255.255在所有网段中都代表广播地址
3、广播的实现
1)在udp服务端加上setsockopt即可
2)广播地址Bcast
3)代码/net/broadcast/
4)结果
5)抓包
因为是广播,可以用windows抓包
如果是windows中经过路由器转发,可以抓到两次包
二、组播及实现
1、部分主机可以收到
1)D类地址是多播ip,一个ip就是一个多播组,只需要将主机加入,可以是不同网络下的主机
2、多播IP地址
1)多播数据报目的地址要写入多播组的标识
2)一个D类地址标志一个多播组
3)多播地址只能用于目的地址,不能用于源地址
4)源地址向多播组发送数据,在该组播内的主机都可以收到数据
3、接收方
4、组播的实现
六、链路层原始套接字(扩展)
一、链路层原始套接字
1、以太网地址族
二、网络层原始套接字
1、创建
IPv4/原始套接字/抓取的是tcp的包
2、抓包代码
/net/raw
七、域名解析与http服务器实现原理
一、域名解析gethostbyname函数
1、域名解析的含义
ping一个网络,返回一个ip地址,原理就是域名解析函数
2、结构体
3、实现
#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;
}
二、万维网服务器的实现原理
1、万维网基于http协议
1)打开一个网页,客户端先发送,服务端再发给客户端的浏览器,解析成网页
2)HTTP基于tcp,buf换成http请求的内容,和响应的报文
2、HTTP本质上是一个字符串
因此用nc可以访问服务器,只不过客户端可以直接使用网站,nc命令需要获得ip地址和端口(makeru端口80),ping网站可以得到ip地址
3、html解释性语言
4、将万维网的语言复制
可以实现html版本的代码
html实际上传的是字符串,核心是标记语言的文本文件
5、理解万维网的实现思路
实现思路:
1、编写http.txt脚本
2、nc -l 0 80检测本地
3、浏览器访问本地
4、本地服务器接收到报文
5、回传http脚本语言
结果:
三、万维网服务器实现
1、万维网包头
2、html脚本
3、服务器
#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;
}
相关文章:

网络编程开发及实战(下)
一、IO模型 一、基本概念 (一)I/O基本概念 1、基本概念 1)一个完整I/O分为两个阶段: 用户进程空间->内核空间 内核空间->设备空间(磁盘、网卡) 2)内存I/O(无名管道&…...

(H5轮播)vue一个轮播里显示多个内容/一屏展示两个半内容
效果图 : html: <div class"content"><van-swipeclass"my-swipe com-long-swipe-indicator":autoplay"2500"indicator-color"#00C4FF"><van-swipe-itemclass"flex-row-wrap"v-for"(items, index) in M…...

【Proteus仿真】【Arduino单片机】蜂鸣器
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用蜂鸣器等。 主要功能: 系统运行后,蜂鸣器播放音乐。 二、软件设计 /* 作者:嗨小易(QQ&#x…...

seatunnel web ui 构建时报错
报错内容如下 Failed to execute goal com.diffplug.spotless:spotless-maven-plugin:2.29.0:check (default) on project seatunnel-web: The following files had format violations:Failed to execute goal com.diffplug.spotless:spotless-maven-plugin:2.29.0:check (defa…...

Js使用ffmpeg在视频中添加png或gif
Js使用ffmpeg在视频中添加png或gif ffmpeg 使用场景是需要在web端对视频进行编辑 添加图片和gif。 注意: 以下所有的使用案例均基于vue3 setup。 同时由于ffmpeg版本不同会导致使用的api不同,使用案例前需要注意ffmpeg版本问题。 如果使用的是0.12需要使用新的…...

多线程 Leetcode 打印零与奇偶数
现有函数 printNumber 可以用一个整数参数调用,并输出该整数到控制台。 例如,调用 printNumber(7) 将会输出 7 到控制台。 给你类 ZeroEvenOdd 的一个实例,该类中有三个函数:zero、even 和 odd 。ZeroEvenOdd 的相同实例将会传递…...

杭电oj--数列有序
有n(n<100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。 输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已…...

PHPEXCEL解决行数超过65536不显示问题
起因自然是导出数据到excel文件时,数据缺少现象。 百度讲解是将xls文件另存为xlsx文件。 除了这里的原因,还有一点是phpExcel存在两个写入类PHPExcel_Writer_Excel2007和PHPExcel_Writer_Excel5,而只有PHPExcel_Writer_Excel2007支持超过65…...

新媒体时代如何做好新型的网络口碑营销?
从人类开始交换商品的时代开始,口碑营销就已经存在,是靠口耳传播的营销方式。小马识途认为进入当今移动互联网时代,口碑营销又有了新的发展,网络口碑营销推广开始普及。营销人员将传统口碑营销与移动互联网营销相结合,…...

MySQL中InnoDB插入缓冲区(Insert Buffer)
一、插入缓冲区的基本原理 插入缓冲区(Insert Buffer,也称作 Change Buffer),是InnoDB存储引擎的一种内部机制,它允许系统将对非聚集索引页的写操作(例如插入、删除和更新)暂时缓存在内存中&am…...

VUE前端判断是电脑端还是移动端
背景需求 ruoyi框架,前后端分离。现在要在用户访问的时候根据不同的设备跳转到不同的登录页面。 教程 router/index.js 修改src/router/index.js,在这里增加自己的要跳转的页面 permission.js 在白名单中添加自己的登录页面 增加以下识别的代码 le…...

OpenGL —— 2.8、漫游之摄像机飞行移动(附源码,glfw+glad)
源码效果 C源码 纹理图片 需下载stb_image.h这个解码图片的库,该库只有一个头文件。 具体代码: vertexShader.glsl #version 330 corelayout(location 0) in vec3 aPos; layout(location 1) in vec2 aUV;out vec2 outUV;uniform mat4 _modelMatrix; …...

AM@麦克劳林公式逼近以及误差分析
abstract 麦克劳林公式及其近似表示的应用误差估计和分析 Lagrange型泰勒公式的估计误差 由Lagrange型余项泰勒公式可知,多项式 p n ( x ) p_n(x) pn(x)近似表达函数 f ( x ) f(x) f(x)时,其误差为 ∣ R n ( x ) ∣ |R_{n}(x)| ∣Rn(x)∣ R n ( x ) R_{n}(x) Rn(x) f …...

gitlab 离线安装问题解决:NOKEY,signature check fail
1,rpm安装gitlab问题 test1:/opt # rpm -ivh gitlab-ce-16.0.3-ce.0.el7.x86_64.rpm --force warning: gitlab-ce-16.0.3-ce.0.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID f27eab47: NOKEY error: [upel]: gitlab-ce NOKEY error: [upel]: gitlab-ce …...

uniapp使用uQRCode绘制二维码,下载到本地,调起微信扫一扫二维码核销
1.效果 2.在utils文件夹下创建uqrcode.js // uqrcode.js //--------------------------------------------------------------------- // github https://github.com/Sansnn/uQRCode //---------------------------------------------------------------------let uQRCode {…...

手写一个PrattParser基本运算解析器3: 基于Swift的PrattParser的项目概述
点击查看 基于Swift的PrattParser项目 PrattParser项目概述 前段时间一直想着手恶补 编译原理 的相关知识, 一开始打算直接读大学的 编译原理, 虽然内容丰富, 但是着实抽象难懂. 无意间看到B站的熊爷关于普拉特解析器相关内容, 感觉是一个非常好的切入点.所以就写了基于Swift版…...

三江学院“火焰杯”软件测试高校就业选拔赛颁奖仪式
11月25日下午,“火焰杯”软件测试开发选拔赛及三江-慧科卓越工程师班暑期编程能力训练营颁奖仪式在s楼会议室隆重举行。计算机科学与工程学院院长刘亚军、副院长叶传标、曹阳、吴德、院党总支副书记王兰英、系主任杨少雄、慧科企业代表尹沁伊人、项目负责人王旭出席…...

面试题-消息中间件篇-主流的消息中间件
消息中间件篇 第一章 主流的消息中间件对比 1、主流的消息中间件有 Kafka、RabbitMQ、ActiveMQ 等。 Kafka: Kafka 是一种高吞吐量、分布式、可扩展的发布/订阅消息系统,主要用于大数据处理和分析。Kafka 采用消息日志的方式来存储消息,可以…...

PyQt学习笔记-获取Hash值的小工具
目录 一、概述1.1 版本信息:1.2 基本信息:1.2.1 软件支持的内容:1.2.2 支持的编码格式 1.3 软件界面图 二、代码实现2.1 View2.2 Controller2.3 Model 三、测试示例 一、概述 本工具居于hashlibPyQtQFileDialog写的小工具,主要是…...

【(数据结构)— 双向链表的实现】
(数据结构)— 双向链表的实现 一.双向链表的结构二. 双向链表的实现2.1 头文件 ——双向链表的创建及功能函数的定义2.2 源文件 ——双向链表的功能函数的实现2.3 源文件 ——双向链表功能的测试2.4 双向链表各项功能测试运行展示2.4.1 双向链表的初始化…...

酷克数据发布HD-SQL-LLaMA模型,开启数据分析“人人可及”新时代
随着行业数字化进入深水区,企业的关注点正在不断从“数字”价值转向“数智”价值。然而,传统数据分析的操作门槛与时间成本成为了掣肘数据价值释放的阻力。常规的数据分析流程复杂冗长,需要数据库管理员设计数据模型,数据工程师进…...

FL Studio21最新中文破解进阶高级完整版安装下载教程
目前水果软件最版本是FL Studio21,它让你的计算机就像是全功能的录音室,大混音盘,非常先进的制作工具,让你的音乐突破想象力的限制。喜欢音乐制作的小伙伴千万不要错过这个功能强大,安装便捷的音乐软件哦!如…...

MDN--Web性能
CSS 动画与 JavaScript 动画 动画的实现可以有很多种方式,比如 CSS transition 和 animation 或者基于 JavaScript 的动画(使用 requestAnimationFrame()) CSS 过渡和动画 CSS transiton :创建当前样式与结束状态样式之间的动画。尽管一个元素处于过渡状态中&…...

Vue3.js:自定义组件 v-model
Vue3的自定义v-model和vue2稍有不同 文档 https://cn.vuejs.org/guide/components/v-model.html 目录 原生组件自定义组件CustomInput实现代码1CustomInput实现代码2 v-model 的参数 原生组件 <input v-model"searchText" />等价于 <input:value"s…...

AI虚拟主播开发实战(附源码)
人工智能 文章目录 人工智能前言 前言 https://blog.csdn.net/icemanyandy/article/details/124035967...

innoDB如何解决幻读
Mysql的事务隔离级别 Mysql 有四种事务隔离级别,这四种隔离级别代表当存在多个事务并发冲突时,可能出现的脏读、不可重复读、幻读的问题。其中 InnoDB 在 RR 的隔离级别下,解决了幻读的问题 事务隔离级别脏读不可重复读幻读未提交读ÿ…...

Git - 导出(archive)、忽略(gitignore)、隐藏(Stash)、合并冲突(merge)的解决方法
概述 本次集中总结了Git4个常规操作,导出(archive)、忽略(gitignore)、隐藏(Stash)、合并冲突(merge)的解决方法,希望帮助到正在辛苦寻找的你。 .gitignore忽略文件 之前开发和部署服务比较仓促,所以有很多图片文件一起加载到服务中&#…...

【Javascript】‘var‘ is used instead of ‘let‘ or ‘const‘
解决: 设置完之后,var 就不会再出现黄色波浪线警告...

金融统计学方法:神经网络
目录 1.神经网络 2.深度神经网络 3.案例分析 1.神经网络 神经网络是模仿人脑神经元工作原理而设计的一种算法模型。在一个基本的神经网络中,存在多个“神经元”或称为“节点”,这些节点被组织成多个层次。每个节点都接收前一层的输入,进行…...

任何人不知道这款超实用的配音软件,我都会伤心的OK?
看完一段精彩的视频,令人陶醉的原因之一就是配音,有的充满感情,有的字正腔圆,相信很多人都不知道这样的声音是怎么配出来的?今天,小编就来给大家分享一款超实用的配音软件,不仅操作简单…...