关于linux软件编程12——网络编程3

一、单循环服务器
特点:
1.可以处理多个客户端 (不能同时)
2.效率不高

//单循环服务器:
socket
bind
listen
while (1)
{connfd =  accept();//通信 
}特点:简单 可以处理多客户端 不能同时 

二、并发服务器    --- 同时可以处理多个客户端

1、设置一个选项(开启一个功能) ---让地址重用

int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
功能:设置socket的属性参数:	 @sockfd   --- 要设置的socket @level    --- 设置socket层次 //socket本身 tcp ip @optname  --- 选项名字 @optval   --- 选项值 @optlen   --- 长度 设置一个选项(开启一个功能) ---让地址重用 地址重用:

//并发服务器 --- 同时处理多个客户端 
socket
bind
listen
while (1)
{
connfd =  accept();
//通信 
//进程
// ---专门创建一个子进程 --- 负责通信过程    
//线程
// ---专门创建一个线程 --- 负责通信过程   
}

//并发服务器 --- 同时处理多个客户端 
socket
bind
listen
while (1)
{connfd =  accept();//通信 //进程// ---专门创建一个子进程 --- 负责通信过程    //线程// ---专门创建一个线程 --- 负责通信过程   
}

将两个任务:
1.负责完成连接操作 
accept   
2.负责通信的 

多进程 和 多线程

并发服务器 ---多进程方式的效率 肯定 低于 多线程

三、更高效的方式:多路IO复用

多路IO 
I   --- input
O   --- output
复用 
一个进程 
一个线程 可以处理多路IO 
//这多路IO 复用了这个一个进程 或是线程

比较:

//并发服务器 --- 同时处理多个客户端 
socket
bind
listen
while (1)
{
connfd =  accept();
//通信 
//进程
// ---专门创建一个子进程 --- 负责通信过程    
//线程
// ---专门创建一个线程 --- 负责通信过程   
}


//一路io
accept
//另一路io
负责通信

多路IO 
把负责通信的那个进程 或 线程 
用来处理多个客户端的通信

/多进程或多线程的并发服务器

一个客户端 ----> 一个进程 或 线程 


//IO多路复用 
N个客户端 -----> 一个进程 或 线程

提高并发的能力

        socket  
|
bind
|
listen
|
accept
|
do_client1 do_client2  do_client3


socket  
|
bind
|
listen
|
accept
|
do_client1   do_client2  do_client3
|   |   |
cli1 cli2 cli3 cli4 cli5 cli6 cli7 cli8 cli9  

四、多路IO复用功能的相关函数

select
poll
epoll

五、IO处理的模型

阻塞IO模型:i -- 读 scanfgetcharfgetsreadrecvo -- 写写有阻塞    //管道 读端存在 写管道

阻塞IO模型:

以读为例:
读操作--->内核中读取数据--->如果没有数据,一直等到,直到有数据--->之后将数据带回到用户空间        
非阻塞IO模型:
以读为例:
读操作--->内核中读取数据--->如果没有数据,不等,直接返回用户空间

阻塞 与 非阻塞 是操作对象的特性 

5.1设置非阻塞的函数 fcntl

//设置非阻塞 
fcntl
#include <unistd.h>
#include <fcntl.h>int fcntl(int fd, int cmd, ... /* arg */ );
功能:维护文件描述符
参数:@fd  --- 要操作的fd@cmd --- 要做的一些操作 //command@... --- 可变参数 
返回值 取决于所做的操作 
int printf(const char *format, ...);printf("hello world!\n");
printf("a = %d\n",a);
printf("a = %d b = %c\n",a,b);设置非阻塞
int flags;
flags = fcntl(fd,F_GETFL,0); //读 
flags = flags | O_NONBLOCK;  //修改 
fcntl(fd,F_SETFL,flags);     //写 点对点聊天client  <----------> serverfgetswrite/send -----> recv/read printf fgetsread<------writeprintf

5.2信号驱动IO:

信号驱动IO//signal
1.fcntl  --- 设置 信号接受者 flags = fcntl(fd,F_GETFL); //获得当前标志 fcntl(fd,F_SETFL,flags|O_ASYNC); O_ASYNC //开启异步操作 //同步 //A->B//异步 //A//B
2.将该程序 和 SIGIO信号关联起来 fcntl(fd,F_SETOWN,pid);//OWNER 
3.设置信号处理函数 signal(SIGIO)如果 程序要处理多路IO   缺点:处理的数量有限 

IO多路复用方式 
//可以处理多路IO 
//不需要 阻塞
//不需要 轮询 

因此

六、IO多路复用方式:

6.1slect函数;

select 
0  --- 读
1  --- 写
2  --- 出错int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);功能:实现IO多路复用 @nfds      //是关心的文件描述符中最大的那个文件描述符 + 1  
@readfds   //代表 要关心 的 读操作的文件描述符的集合 
@writefds  //代表 要关心 的 写操作的文件描述符的集合
@exceptfds //代表 要关心 的 异常的文件描述符的集合
@timeout   //超时 --- 设置一个超时时间 //NULL 表示select是一个阻塞调用 //设置时间 //         0 --- 非阻塞 //    n (>0) --- 阻塞n这么长时间 //注意: 这个值 每次 自动在往下减少 --直到减少到0struct timevalstruct timeval {long    tv_sec;         /* seconds */long    tv_usec;        /* microseconds */};struct timeval t = {0,0};返回值:成功 返回就绪的文件描述符的数量 失败 -1 

6.2select函数使用的整体思路:

//select使用时的整体思路:
1.建立一张表  监控fd_set readfds; //一张表 			  FD_ZERO(&readfds); //清空这张表			  
2.将要监控的文件描述符 添加表中 FD_SET(0,&readfds);FD_SET(fd,&readfds);3. nfds = fd + 1; 
select(nfs,&readfds,NULL,NULL,NULL)void FD_CLR(int fd, fd_set *set); //将fd从set集合中清除 
int  FD_ISSET(int fd, fd_set *set);//判断fd是否在set中 
void FD_SET(int fd, fd_set *set);//将fd添加到set集合中
void FD_ZERO(fd_set *set);//将set集合清空 

6.3使用:

多路IO复用的服务器: //实现并发 --- 可以同时处理多个客户端listenfd = socket
bind
listen
//connfd = accept
//1.准备表fd_set readfds;FD_ZERO(&readfds);
//2.添加要监控的文件描述符 FD_SET(listenfd,&reafds);
//3.准备参数 maxfds = listenfd + 1;fd_set backfds; 
while (1)
{   backfds = readfds;int ret = select(maxfds,&backfds,NULL,NULL,NULL);if (ret > 0){int i = 0;for (i = 0; i < maxfds;++i){if (FD_ISSET(i,&backfds)){if (i == listenfd) //连接 {connfd = accept();//connfd 要被添加到 监控表FD_SET(connfd,&readfds);if (connfd + 1 > maxfds)maxfds = connfd + 1;}else //负责与客户端通信 {//	i = ?//fd 此时就绪 printf("buf = %s\n",buf);if (strncmp(buf,"quit",4) == 0){FD_CLR(i,&readfds); //清除对应的客户端的fdclose(i);	}}}}}
}//优化
int i = maxfds;
for (i = maxfds-1; i >= 0; --i)
{if (FD_ISSET(i,&readfds)){maxfds = i + 1;}
}

不足:   

 1. 最大监听数受限:`FD_SETSIZE` 默认 1024(Linux)
2. 每次调用需重置 fd_set:内核会修改集合,必须每次重新 `FD_SET`
3. 用户态与内核态拷贝开销大
4. 返回后仍需遍历所有 fd 才能知道哪个就绪
5. 效率随 fd 数量增长下降明显

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

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

相关文章

thinkphp6通过workerman使用websocket

安装workerman依赖 composer require topthink/think-worker composer require topthink/think-worker1.0.* # 指定兼容版本‌:ml-citation{ref"1,7" data"citationList"}config配置 config/worker.php <?php return [// 扩展自身需要的配置host …

Rust SQLx 开发指南:利用 Tokio 进行性能优化

在当今高并发的应用开发环境中&#xff0c;数据库操作往往是性能瓶颈的主要来源之一。SQLx 作为一个纯 Rust 编写的异步 SQL 客户端库&#xff0c;通过与 Tokio 运行时深度集成&#xff0c;为开发者提供了处理数据库 I/O 密集型操作的强大工具。本文将带您深入了解如何利用这两…

嵌入式硬件电路分析---AD采集电路

文章目录摘要AD采集电路1AD采集电路2R77的真正作用是什么&#xff1f;理想与现实&#xff1a;为什么通常可以忽略R77的影响&#xff1f;摘要 AD采集 AD采集电路1 这是个人画的简化后的AD采集电路 这是一个AD检测电路&#xff0c;R1是一个可变电阻&#xff0c;R2是根据R1的常用…

Python爬取nc数据

1、单文件爬取爬取该网站下的crupre.nc数据&#xff0c;如下使用requests库&#xff0c;然后填写网站的url&#xff1a;"http://clima-dods.ictp.it/regcm4/CLM45/crudata/"和需要下载的文件名&#xff1a;"crupre.nc"import requests import osdef downlo…

策略模式 + 工厂模式

策略模式&#xff1a;简单来说解决的行为的封装与选择。如HandlerMapping&#xff0c;将 HTTP 请求映射到对应的处理器&#xff08;Controller 或方法&#xff09;。工厂模式&#xff1a;解决的是具有相同属性的对象创建问题&#xff0c;如BeanFactory创建bean对象。解决的代码…

Diamond基础3:在线逻辑分析仪Reveal的使用

文章目录1. 与ILA的区别2. 使用Reveal步骤3.Reveal注意事项4.传送门1. 与ILA的区别 Reveal是Lattice Diamond集成开发环境用于在线监测信号的工具&#xff0c;ILA是xilinx的Vivado集成开发工具的在线逻辑分析仪&#xff0c;同Reveal一样&#xff0c;均可以在项目运行过程中&am…

超适合程序员做知识整理的 AI 网站

这次要给大家分享一个超适合程序员做知识整理的 AI 网站 ——Notion AI&#xff0c;网址是Notion&#xff0c;它能把你随手记的杂乱笔记、代码片段、技术文档&#xff0c;一键梳理成逻辑清晰的结构化内容&#xff0c;小索奇我用它整理 “Python 爬虫知识点” 时&#xff0c;原本…

【 Selenium 爬虫】2025年8月25日-pixabay 图片采集

无恶意采集&#xff0c;取部分图片用来做相册测试的&#x1f604; 效果图import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.la.selenium.utils.SeleniumUtil; import lombok.extern.slf4j.Slf4j; import o…

服务器托管需要注意什么事项?

服务器托管是企业IT基础设施的关键环节&#xff0c;其稳定性和安全性直接影响业务连续性。需要注意下面这几点&#xff01; 一、服务商与机房选择 服务商资质 选择持有ISP证书的合法服务商&#xff0c;优先考虑运营超5年、市场口碑佳的老牌公司&#xff0c;技术团队需具备72…

微信小程序备忘

1.按钮事件中想切换到tabBar中的链接用switchTab&#xff0c;不能用navigateTo&#xff1a;agentPage: function() { wx.switchTab({url: /pages/agent/agent}) },特别注意&#xff1a;微信小程序中所谓的自定义&#xff0c;并不是完全的自定义&#xff0c;在app.json中定义&a…

虚拟机NAT模式通过宿主机(Windows)上网不稳定解决办法(无法上网)(将宿主机设置固定ip并配置dns)

文章目录问题描述解决办法分析**1. 问题的根本原因****(1) 宿主机动态IP的DNS配置问题****(2) NAT模式下的网络依赖****(3) 自习室WiFi的潜在限制****2. 用户操作的合理性分析****(1) 固定IP的作用****(2) 手动指定公共DNS的作用****3. 用户怀疑的正确性****4. 其他可能原因的排…

基于 HTML、CSS 和 JavaScript 的智能图像虚化系统

目录 1 前言 2 技术实现 2.1 HTML&#xff1a;搭建页面基础结构 2.2 CSS&#xff1a;打造科技感视觉体验 2.3 JavaScript&#xff1a;实现核心虚化功能 2.3.1 图像上传与初始化 2.3.2 实时虚化处理 2.3.3 图像下载功能 3 完整代码 4 运行结果 5 总结 1 前言 三大核…

PS更改图像尺寸

新建文档 1.左上角——新文件可以新建文档2.文件——新建文档3.快捷键CtrlN 对文件命名 输入新文件名称设置宽度和高度 设置文件的宽高&#xff0c;单位可以是像素、英寸、厘米等。还可以选择文件方向或者是否使用画板模式画布背景色 一般显示白色&#xff0c;也可以选择其他颜…

分词器详解(一)

文章目录&#x1f31f; 第0层&#xff1a;极简版&#xff08;30秒理解&#xff09;核心公式生活比喻&#x1f4da; 第1层&#xff1a;基础概念&#xff08;5分钟理解&#xff09;1. 分词器基础1.1 分词器的核心作用1.2 主流分词算法对比2. 基础实现2.1 BPE实现原理2.2 特殊标记…

推荐一个论文阅读工具ivySCI

1.一些关于ivySCI的数据 &#xff08;摘自&#xff1a;吴焱红&#xff0c;论文示范:ivySCI 在论文管理、阅读和笔记中的体验&#xff09; 1.科研人员花在文献阅读上的时间占总工作时间的 23%2.每年阅读的文献数量大概是 188 到 280 篇3.ivySCI 提供 Pad(iPad 和 Android) 和桌…

诊断服务器(Diagnostic Server)

在《SWS_Diagnostics.pdf》中,诊断服务器(Diagnostic Server) 是诊断管理(DM)的核心执行单元,聚焦 “软件集群(SoftwareCluster)级诊断资源的独立管控”,实现 UDS(ISO 14229-1)与 SOVD(ASAM 服务化诊断)的全流程诊断功能。以下结合文档 7.3 节 “Diagnostic Serve…

如何开发一款高稳定、低延迟、功能全面的RTSP播放器?

一、引言&#xff1a;RTSP的价值与挑战 RTSP&#xff08;Real-Time Streaming Protocol&#xff09;作为实时流媒体传输的核心协议&#xff0c;广泛应用于安防监控、无人机回传、教育互动、远程医疗、单兵指挥等行业。它提供了 基于请求/响应机制的流媒体控制能力&#xff0c;…

数据结构——树(03二叉树,与路径有关的问题,代码练习)

文章目录一、求二叉树的值【层序遍历实现】1.1右视图1.2层最大值1.3层和1.4最底层的叶子结点的和1.5层平均值1.6最大层和的层号二、二叉树的路径2.1根节点到叶子节点&#xff0c;二叉树的路径2.2路径的十进制之和 & 二进制之和2.3二叉树里的路径三、二叉树的路径23.1最长同…

Git配置:禁用全局HTTPS验证

文章目录Git配置&#xff1a;禁用全局HTTPS验证什么是HTTPS验证&#xff1f;为什么需要禁用HTTPS验证&#xff1f;如何禁用全局HTTPS验证&#xff1f;注意事项结论Git配置&#xff1a;禁用全局HTTPS验证 在软件开发和版本控制中&#xff0c;Git是一个不可或缺的工具。它帮助开…

【54页PPT】基于DeepSeek的数据治理技术(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2501_92796370/91778320 资料解读&#xff1a;《基于DeepSeek的数据治理技术》 详细资料请看本解读文章的最后内容。 作为数据治理领域的资深研究者&#…