网络编程开发及实战(下)

news2024/11/8 11:22:57

一、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函数

一、IO多路复用select函数
1、IO多路复用模型
1)select:复用fd_set文件集合,可以把多个文件描述符集合,调用select函数,调用内核
2、select函数
1)nfds:文件描述符
2)readfds:可读
writefds:可写
exceptfds:错误流
本次定义关心什么
3)timeout:时间颗粒us
4)其他多路复用函数poll/epoll API
可读集合最常用,可写一般不阻塞,异常直接处理
5)timeout = 0非阻塞
NULL:永久阻塞
6)select不仅是多路复用,一般函数等待时间是ms,select函数等待颗粒度细,只设置最后一个参数,达到阻塞几us
3、fd_set结构体
1)一次申请8字节,64bit位,当nfds满了,再次申请8个字节,直到进程最大文件描述符(1024/2048字节)
2)在内核中,只观察置1,也就是3,4,6文件描述符有没有数据
二、多路复用select实现
三、select实现代码优化

三、多路复用poll函数

一、多路复用poll函数

1、多路复用

2、poll函数

第一个参数:复用的数组

第二个参数:顺序表的字段

第三个参数:ms

revents:系统返回

0:立刻返回,负数永久阻塞

二、poll的实现

四、套接字属性

一、选项级别

1、选项级别:套接字实现了tcp、ip还有一些链路和以太网的功能,不同选项级别对应不同的层次
2、获取选项
3、选项相当于属性,套接字选项也可以称为套接字属性
4、选项可以分为只可获取,不可设置,有些选项即可获取也可设置
5、选项级别

6、socket级别

监听有listen函数,所以只能获取不能监听
7、ip级别

8、获取套接字函数

二、getsockopt获取套接 字选项

三、setsockopt设置套接字选项

五、广播和组播

一、广播及实现

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;

}

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

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

相关文章

YOLOv5算法改进(13)— 如何去更换主干网络(2)(包括代码+添加步骤+网络结构图)

前言:Hello大家好,我是小哥谈。为了给后面YOLOv5算法的进阶改进奠定基础,本篇文章就继续通过案例的方式给大家讲解如何在YOLOv5算法中更换主干网络,本篇文章的特色就是比较浅显易懂,附加了很多的网络结构图,通过结构图的形式向大家娓娓道来,希望大家学习之后能够有所收获…

大咖云集,智慧碰撞|第 18 届 CLK 大会完整议程揭晓(内附报名通道)

自 2006 年以来&#xff0c;在国内 Linux 技术爱好者和行业公司的鼎力支持下&#xff0c;中国 Linux 内核开发者大会已走过 17个年头&#xff0c;是中国 Linux 内核领域最具影响力的峰会之一。今年的中国内核开发者大会依然秉承历届理念&#xff0c;以“自由、协作、创新”为理…

C++学习:类

一、类的概念 类是一种将抽象转换为用户定义类型的C工具&#xff0c;它将数据和数据处理组合成一个整体。 比如股票类&#xff0c;首先要考虑如何表示股票。可以将某人持有的股票当成一个基本单元&#xff0c;数据包括他持有股票的数量&#xff0c;哪个公司的股票&#xff0c…

addEventListener与useeffect相撞的火花

const [a, seta] useState(1) const [loading, setLoading] useState(false) //用于等到某个异步操作返回结果后再允许再次触发fn函数useEffect(() > {document.addEventListener(LazShake.Event.onShakeOnce, () > {fn(listener);});}, []);useEffect(() > {setTim…

Kurento多对多webrtc会议搭建测试

环境ubuntu18.04 KMS版本6.13.0 多对多通信demo7.0.0 KMS运行起来后&#xff0c;通过运行它的一个个demo&#xff0c;来实现不同的功能&#xff0c;它的demo很多如下&#xff1a; https://github.com/Kurento 里面有一对一&#xff0c;多对多&#xff0c;还有一些特效的demo。…

OSI笔记

由7层组成&#xff0c;由下自上分别为&#xff1a; 物理层&#xff08;硬件方面&#xff0c;例如物理网络设备、布线电缆、光纤等&#xff09;&#xff0c; 传输数据主要是比特流0 1 、电信号数据链路层&#xff08;确定了0 1 的分组方式&#xff0c;通过广播的方式&#xff0…

京东商品详情API接口(标题|主图|SKU|价格|库存..)

京东商品详情接口的应用场景有很多&#xff0c;以下为您推荐几种&#xff1a; 电商平台集成&#xff1a;如果想要实现商品查询、购买、支付等功能&#xff0c;提高自身平台的电商能力&#xff0c;可以将京东API接口集成到自己的电商网站或应用程序中。第三方开发者插件&#x…

央国企、金融信创改造必备的Windows AD域控国产替代方案

自国资委下发79号文并明确规定了2027年底前信息系统全面替换的目标后&#xff0c;金融机构、大型央国企均规划起信创改造方案&#xff0c;其中金融机构更是走在8大行业信创前列&#xff0c;成为央国企、医疗、能源等行业国产化改造的参考样板。 在参与并负责某大型金融机构与某…

他海投260万未回本,一天手写200面单到效率提升200%,经历了什么

他们是时代里的“小人物”&#xff0c;正经历着最为蓬勃的商业变革。年轻一代的创业老板们站在十字路口上&#xff0c;比老一辈更懂直播风口、人工智能、云计算、智能制造、数字经济等经济热词的含义。 作为北京快递行业内少见的本地人&#xff0c;范小菲形容自己的创业历程是…

新媒体时代如何做好新型的网络口碑营销?

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

英语什么时候加s和es

名词变复数一般情况下加s&#xff0c;以s,x,ch,sh结尾加es。一个名词如果表示一个或一样东西&#xff0c;它取单数形式&#xff0c;如果表示两个或更多的这类东西&#xff0c;则需要用名词复数形式。 1 以s,x,sh,ch结尾的词&#xff0c;加es。 2 以辅音字母&#xff08;除a/e/…

(一)库存超卖案例实战——库存超卖现象的产生及其解决方案概述

前言 本节内容我们主要介绍一下web应用中常见的一类问题——产品“超卖”问题&#xff0c;通过一个springboot项目案例完成超卖现象的演示&#xff0c;并针对不同的应用场景下&#xff0c;提供这一类问题的解决方案&#xff0c;关于更详细的解决方案案例实战内容&#xff0c;请…

ATFX汇市:日本9月核心CPI年率降低至2.8%,创出13个月以来新低

ATFX汇市&#xff1a;据日本总务省统计局数据&#xff0c;日本9月核心CPI年率为2.8%&#xff0c;低于前值3.1%&#xff0c;略高于预期值2.7%&#xff0c;创出自2022年9月核心CPI站上3%关口后的新低。今年一月份&#xff0c;日本核心CPI冲高至4.2%&#xff0c;国际金融市场一度猜…

ATA-M4功率放大器都有哪些具体特点及优势

我们的ATA-M系列功率放大器&#xff0c;旨在将它打造为超越ATA-L系列水声功率放大器高频限制的系列产品。其中ATA-M4功率放大器是一款理想的单通道功率放大器。最大输出345Vrms电压&#xff0c;400VA功率&#xff0c;可驱动0~100%的阻性或非阻性负载。输出阻抗匹配多个档位可选…

双11必看,2023京东双11红包首发时间介绍

双11必看&#xff0c;2023京东双11红包首发时间介绍 10月15日星期日消息&#xff1a;在双十一期间姐妹们最关心的就是商品价格、双11红包、跨店满减&#xff0c;因为这3样就决定我们购物成本。据悉&#xff0c;2023年京东双11京享红包首发时间已经确定了10月23日20点。下面小编…

Qemu镜像安全加密测试

文章目录 简介1.已经过时的qemu自带的加密方式介绍1.1.创建secret uuid的xml1.2.产生uuid1.3.给secret赋值1.4.创建一个存储池1.5.在存储池中创建一个镜像1.6.在虚拟机中使用该镜像 2.弃用以上加密方式2.1.原作者Daniel Berrange的观点2.2.Markus Armbruster更深入的操作 3. LU…

精益求精:使用Ansible集中式自动备份核心数据

1、引言 在当今数字化时代&#xff0c;数据是企业和组织的核心资产。为了确保数据的安全性和可恢复性&#xff0c;备份是至关重 要的。然而&#xff0c;手动备份数据可能会繁琐且容易出错&#xff0c;特别是在面对大规模和分布式的数据存储情况下。幸运的是&#xff0c;Ansibl…

2023【建议收藏】uniapp( vue3)使用canvas生成海报并保存,taro/微信小程序也适用

有段时间没写vue了&#xff0c;有点生疏了...... 1、代码有注释&#xff0c;完整代码如下 <template><view class"page"><canvas class"canvas" v-if"isShow" :style"{width:${canvasWidth}px,height:${canvasHeight}px}&…

Python学习笔记——类、魔术方法

食用说明&#xff1a;本笔记适用于有一定编程基础的伙伴们。希望有助于各位&#xff01; 类 类的运用很常见&#xff1a;在大部分情况下&#xff0c;对一些特有的对象&#xff0c;可以使用特定的类来指向它&#xff1a; class Person:name unknownage -1sex 0partner No…