网络编程开发及实战(下)
一、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 双向链表的初始化…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
