嵌入式学习日记(35)TCP并发服务器构建

 单循环服务器:服务端同一时刻只能处理一个客户端的任务

并发服务器:服务端同一时刻可以处理多个客户端的任务


TCP并发服务器构建:

TCP:
1. 建立连接,一对一

TCP服务端并发模型:

1.  多进程
进程资源开销大;安全性高
2.  多线程
线程相对与进程资源开销小,相同资源环境下,并发量比进程大。

3.  线程池
为了解决多线程或者多进程模型,在服务器运行过程,频繁创建和销毁线程(进程)带来的时间消耗问题。
基于生产者和消费者编程模型,以及任务队列等,实现的一套多线程框架。

4.  IO多路复用
I-->O:fd
对多个文件描述符的读写可以复用一个进程。

      在不创建新的进程和线程的前提下,使用一个进程实现对多个文件读写的同时监测。

      fgets(stdin);
recv(connfd);
阻塞IO模式:
1. 多个任务之间是同步的效果

      1)select
2)poll
3)epoll

select实现IO多路复用:

      1. 创建文件描述符集合                  fd_set
2. 添加关注的文件描述符到集合   FD_SET();
3. 使用select传递集合表给内核,内核开始监测事件  select()
4. 当内核监测到事件时,应用层select将解除阻塞,并获得相关的事件结果
5. 根据select返回的结果做不同的任务处理


void FD_CLR(int fd, fd_set *set);
int  FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);


int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
功能:传递文件描述符结合表给内核并等待获取事件结果
参数:
nfds : 关注的最大文件描述符+1
readfds:读事件的文件描述符集合
writefds:写事件的文件描述符集合
exceptfds:其他事件的文件描述符集合
timeout:设置select监测时的超时时间
NULL : 不设置超时时间(select一直阻塞等待)

        返回值:
成功:返回内核监测的到达事件的个数
失败:-1
0 : 超时时间到达,但没有事件发生,则返回0

利用select搭建并发服务器

#include "head.h"#define SER_PORT 50001
#define SER_IP "192.168.0.180"int init_tcp_ser()
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0){perror("socket error");return -1;}struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(SER_PORT);seraddr.sin_addr.s_addr = inet_addr(SER_IP);int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if(ret < 0){perror("bind error");close(sockfd);return -1;}ret = listen(sockfd,5);if(ret < 0){perror("listen error");close(sockfd);return -1;}return sockfd;
}int main()
{struct sockaddr_in cliaddr;socklen_t clilen = sizeof(cliaddr);int sockfd = init_tcp_ser();if(sockfd < 0){return -1;}fd_set sockfds;fd_set sockfdstmp;FD_ZERO(&sockfds);FD_SET(sockfd,&sockfds);int maxfd = sockfd;char buff[1024] = {0};while(1){sockfdstmp = sockfds;int cnt = select(maxfd + 1,&sockfdstmp,NULL,NULL,NULL);if(cnt < 0){perror("select error:");return -1;}if(FD_ISSET(sockfd,&sockfdstmp)){int connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&clilen);if(connfd < 0){perror("accept error:");return -1;}FD_SET(connfd,&sockfds);maxfd = maxfd > connfd ? maxfd : connfd;}for(int i = sockfd + 1;i <= maxfd;++i){if (FD_ISSET(i, &sockfdstmp)){memset(buff,0,sizeof(buff));ssize_t cnt = recv(i,buff,sizeof(buff),0);if(cnt < 0){perror("receive error:");FD_CLR(i,&sockfdstmp);close(i);continue;}else if(cnt == 0){printf("[%s:%d]:offline\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));FD_CLR(i, &sockfds);close(i);continue;}printf("[%s:%d]:%s\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port),buff);strcat(buff,"->ok");cnt = send(i,buff,strlen(buff),0);if(cnt < 0){perror("send error:");FD_CLR(i,&sockfdstmp);close(i);continue;}}}}close(sockfd);return 0;
}

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

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

相关文章

【Flask】测试平台开发实战-第二篇

概述&#xff1a;在上一篇我们已经将后端初始化服务后前端的vue框架初始化已经搭建完整&#xff0c;并且可以运行看到界面&#xff0c;服务正常&#xff0c;当然我们看到的前端数据都是mock下的假数据&#xff0c;并不是真实的&#xff0c;这篇我们来开发实现第一个功能&#x…

聊一聊 .NET 的 AssemblyLoadContext 可插拔程序集

一&#xff1a;背景 1. 讲故事 最近在分析一个崩溃dump时&#xff0c;发现祸首和AssemblyLoadContext有关&#xff0c;说实话这东西我也比较陌生&#xff0c;后来查了下大模型&#xff0c;它主要奔着替代 .NetFrameWork 时代的 AppDomain 的&#xff0c;都是用来做晚期加卸载&a…

Java中使用Spring Boot+Ollama实现本地AI的MCP接入

目录结构完善spring bootpom.xml添加依赖application.ymlMCP 工具配置 mcp-servers.json配置类编写API在我的上一篇文章搭建好本地的聊天机器人后&#xff0c;准备接入MCP进一步增强AI的能力&#xff0c;以实现类似手机AI的功能 参考的是第二篇文章链接其内容比较精炼&#x…

C#正则表达式与用法

&#x1f31f; C# 常用正则表达式与用法C# 使用正则需要引用命名空间&#xff1a;using System.Text.RegularExpressions; 常用方法&#xff1a;Regex.IsMatch(input, pattern) → 返回 bool&#xff0c;用于验证Regex.Match(input, pattern) → 返回 Match 对象&#xff0c;可…

从0开始学习Java+AI知识点总结-27.web实战(Maven高级)

一、分模块设计与开发&#xff1a;让项目结构更清晰1.1 为什么需要分模块&#xff1f;单模块开发的痛点在小型项目中&#xff0c;单模块&#xff08;所有代码放在一个工程&#xff09;或许能满足需求&#xff0c;但项目规模扩大后会出现两大核心问题&#xff1a;维护成本高&…

Ferris Wheel (贪心 | 双指针)

题目&#xff1a;思路&#xff1a;本题注意题目的条件即可&#xff0c;题意说一个摩天轮可以坐一个人或者两个人&#xff0c;那么显然我们就可以贪心一下具体的&#xff0c;我们可以让最小的去匹配最大的&#xff0c;如果此时大于 x&#xff0c;那么显然我们根本无法使得 最大的…

课程视频怎么加密?在线教育机构常用的6个课程加密方法

知识付费时代&#xff0c;课程视频是教育机构的核心资产。但是不难发现&#xff0c;课程视频的安全却得不到保障。各大购物平台搜索课程名称&#xff0c;便出现了许多盗版课程。如何有效防止课程被翻录和二次传播&#xff0c;成为急需解决的关键问题。今天这期分享点干货&#…

SOME/IP-SD中”服务器服务组播端点”、“客户端服务组播端点”与“IPv4组播选项的区分

<摘要> AUTOSIP-SD协议中组播端点&#xff08;Multicast Endpoint&#xff09;在不同上下文中的角色与表述差异。准确理解“服务器服务组播端点”、“客户端服务组播端点”与“IPv4组播选项”中配置的端点之间的关系&#xff0c;是正确实现组播事件分发机制的关键。这涉及…

计算机是如何运行的

目录 一&#xff0c;计算机是如何组成的 1.1&#xff0c;CPU中央处理单元 1.1.1&#xff0c;CPU的构成和属性 1.1.2&#xff0c;如何判断cpu的好坏 1.1.3&#xff0c;指令 1.1.4&#xff0c;CPU的缓存 1.2&#xff0c;操作系统 1.2.1&#xff0c;进程 1.2.2&#xff0…

JavaScript性能优化:实战技巧与高效策略

JavaScript性能优化实战技术文章大纲性能优化的重要性解释为什么性能优化对用户体验和业务指标至关重要列举常见性能问题的影响&#xff08;如跳出率、转化率下降&#xff09;代码层面的优化减少全局变量使用&#xff0c;避免内存泄漏使用事件委托减少事件监听器的数量避免频繁…

解决.env.production 写死 IP 的问题:Vue + config.json 运行时加载方案

背景&#xff1a;前端常用 .env.production 在构建时写死 API 地址 场景&#xff1a;运维部署时经常不知道目标主机 IP/域名 问题&#xff1a;每次 IP 变动都要重新编译 → 增加运维成本 引出需求&#xff1a;只修改 IP 就能完成部署&#xff0c;不需要重新打包 目录一、解决方…

如何从三星手机转移到另一部三星手机

三星Galaxy S系列因其出色的设计、令人惊叹的显示屏、惊艳的摄像头、更好的扬声器以及创新的指纹传感器而受到大多数用户的欢迎&#xff0c;获得了良好的声誉。让用户感到满意的是&#xff0c;三星Galaxy S10拥有更美观的设计、令人惊叹的显示屏、令人惊叹的摄像头、更好的扬声…

聚焦建筑能源革新!安科瑞 “光储直柔” 方案护航碳中和目标实现

1、背景在 “双碳” 目标引领下&#xff0c;能源结构转型与建筑能效提升成为重要课题。清华大学江亿院士提出的 “光储直柔” 新型配电系统&#xff0c;为建筑领域绿色发展提供了创新方向。光储直柔得到了业界广泛认同和积极响应&#xff0c;国家、各部委、地区陆续出台相关政策…

Shell 中 ()、(())、[]、{} 的用法详解

文章目录Shell 中 ()、(())、[]、{} 的用法详解一、先明确&#xff1a;四类符号的核心功能定位二、逐个拆解&#xff1a;用法、示例与避坑点1. ()&#xff1a;子 Shell 执行&#xff0c;隔离环境核心用法1&#xff1a;子 Shell 执行命令&#xff0c;隔离变量核心用法2&#xff…

开发避坑指南(41):Vue3 提示框proxy.$modal.msgSuccess()提示文本换行解决方案

需求 由于接口返回的提示信息过长&#xff0c;接口已经在返回提示中加入换行标签了&#xff0c;但是使用proxy.modal.msgSuccess(res.msg)提示没有换行&#xff0c;那么Vue3中proxy.modal.msgSuccess(res.msg)提示没有换行&#xff0c;那么Vue3 中 proxy.modal.msgSuccess(res.…

[Sync_ai_vid] 唇形同步推理流程 | Whisper架构

链接&#xff1a;https://github.com/bytedance/LatentSync/blob/main/docs/syncnet_arch.md docs&#xff1a;LatentSync LatentSync是一个端到端唇语同步项目&#xff0c;能够生成语音与唇形完美匹配的逼真视频。 该项目通过使用*音频条件化3D U-Net*&#xff08;一种生成式…

uniapp中 ios端 scroll-view 组件内部子元素z-index失效问题

发现子组件中的弹窗在ios手机上会被限制在scroll-view里面&#xff0c;安卓手机上不受限制&#xff0c;网上找了好久原因 scroll-view组件内部设置了 -webkit-overflow-scrolling: touch 样式&#xff0c;导致z-index失效&#xff08;safari 3D变换会忽略z-index的层级问题&…

PyTorch图像预处理完全指南:从基础操作到GPU加速实战

引言 图像预处理是模型性能的"隐形基石"&#xff0c;在计算机视觉任务中直接决定模型能否提取有效特征。科学的预处理流程能让基础模型性能提升15%以上&#xff0c;而GPU加速预处理可使数据准备阶段耗时降低60%以上。本文将聚焦PyTorch预处理核心技术&#xff0c;从基…

【前端教程】 CSS浮动布局解析与优化:从基础实现到工程化改进

浮动(float)是CSS中实现页面布局的经典技术,虽然现代布局更多使用Flexbox和Grid,但理解浮动的工作原理仍是前端开发者的基础素养。本文以一个三栏浮动布局的代码为例,从布局原理解析、潜在问题诊断、工程化优化三个维度,带你深入理解浮动布局的精髓与优化思路。 一、原代…

DVWA靶场通关笔记-暴力破解(Impossible级别)

目录 一、查看源码 二、功能分析 三、SQL注入分析 1、使用PDO预处理语句和参数绑定 2、mysqli_real_escape_string转义 3、stripslashes去除反斜杠 四、暴力破解分析 1、token防止暴力破解机制 2、登录失败随机延迟机制 3、登陆失败报错信息相同 4、登陆失败的账户…