C/S架构学习之使用select实现TCP小型并发服务器
- select实现TCP小型并发服务器的流程:
- 一、创建套接字(socket函数):
通信域
选择IPV4
网络协议、套接字类型选择流式
;
int sockfd = socket(AF_INET,SOCK_STREAM,0); //通信域选择IPV4、套接字类型选择流式
- 二、填充服务器的网络信息结构体:
- 1.定义网络信息结构体变量;
- 2.求出网络信息结构体变量的内存空间大小,以作备用;
- 3.网络信息
结构体清0
; - 4.使用
IPV4
网络协议AF_INET
; - 5.在终端输入的服务器端主机的
IP地址
:inet_addr(argv[1])
; - 6.在终端输入的服务器端网络字节序的
端口号
:htons(atoi(argv[2]))
;
struct sockaddr_in serveraddr; //定义网络信息结构体变量socklen_t serveraddrlen = sizeof(serveraddr);//求出结构体变量的内存空间大小memset(&serveraddr,0,serveraddrlen); //结构体清零serveraddr.sin_family = AF_INET; //使用IPV4网络协议serveraddr.sin_addr.s_addr = inet_addr(argv[1]); //IP地址serveraddr.sin_port = htons(atoi(argv[2]));//网络字节序的端口号
- 三、套接字和服务器的网络信息结构体进行绑定(bind函数):
int ret = bind(sockfd,(struct sockaddr *)&serveraddr,serveraddrlen);
- 四、套接字设置成被动监听(listen函数):
int ret1 = listen(sockfd, 5);
- 五、创建要监听的文件描述符集合:
- 使用select函数后,会将
没有就绪的文件描述符
在集合中去除
,所以需要创建两个文件描述符集合
,一个是母本read_fds
,类似于常量,保持不变,而另一个作为副本read_fds_t
,类似于变量,可以改变;
fd_set read_fds;FD_ZERO(&read_fds);fd_set read_fds_t;FD_ZERO(&read_fds_t);
- 六、把创建的套接字添加到要监视的集合中:
FD_SET(sockfd,&read_fds);int fd_max = 0;fd_max = fd_max > sockfd ? fd_max : sockfd;
- 七、设置系统时间结构体变量,用来指定超时的时间:
struct timeval tm_out;
- 八、等待文件描述符中的事件是否就绪,成功则返回就绪的文件描述符的个数(select函数):
- select函数:
#include <sys/select.h>int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);/*参数:nfds: 要监视的最大文件描述符+1readfds: 要监视的读文件描述符集合 不关心可以传NULLwritefds: 要监视的写文件描述符集合 不关心可以传NULLexceptfds: 要监视的异常文件描述符集合 不关心可以传NULLtimeout: 超时时间 如果设置成NULL 会一直阻塞 直到有文件描述符就绪返回值:成功 就绪的文件描述符的个数超时 0失败 -1 重置错误码*///struct timeval 可以指定超时时间//如果结构体的两个成员都为0 表示非阻塞struct timeval {long tv_sec; //秒 long tv_usec; //微秒};void FD_CLR(int fd, fd_set *set); //将文件描述符在集合中删除int FD_ISSET(int fd, fd_set *set); //判断文件描述符是否还在集合中// 返回0 表示不在了 非0 表示在void FD_SET(int fd, fd_set *set); //向集合中添加一个文件描述符void FD_ZERO(fd_set *set); //清空集合
if(-1 == (ret = select(fd_max + 1,&read_fds_t,NULL,NULL,&tm_out))){perror("select error");exit(-1);}else if(0 == ret){puts("timeout!!!!!");putchar('\n');continue;}
- 九、遍历文件描述符集合,判断哪些文件描述符已经准备就绪:
for(int i = 3; i < fd_max + 1 && 0 != ret; i++){...}
- 十、判断文件描述符是否还在集合中,并且接收来自客户端的数据(recv函数)和给客户端发送应答消息(send函数):
if(FD_ISSET(i,&read_fds_t)){//说明有新的客户端连接服务器if(i == sockfd){ if(-1 == (accept_fd = accept(sockfd,NULL,NULL))){perror("accept error");exit(-1);}printf("客户端[%d]连接到服务器\n",accept_fd);//将新连接的客户端的套接字添加到要监视的集合中FD_SET(accept_fd,&read_fds);fd_max = fd_max > accept_fd ? fd_max : accept_fd;}else //之前连接的客户端在向服务器发送信息{memset(buf,0,sizeof(buf));if(-1 == (nbytes = recv(i,buf,sizeof(buf),0))){perror("recv error");exit(-1);}else if(0 == nbytes){printf("客户端[%d]已断开连接\n",i);//将已断开连接客户端的套接字在文件描述符集合中剔除FD_CLR(i,&read_fds);//关闭套接字close(i);continue;}if(!strncmp(buf,"quit",4)){printf("客户端[%d]已退出\n",i);//将已断开连接客户端的套接字在文件描述符集合中剔除FD_CLR(i,&read_fds);//关闭套接字close(i);continue;}printf("客户端[%d]发来信息[%s]\n",i,buf);//组装应答消息strcat(buf,"----------k");//给客户端发送应答消息if(-1 == send(i,buf,sizeof(buf),0)){perror("send error");exit(-1);}}ret--; //减少遍历次数}
- 十一、关闭套接字(close函数):
close(sockfd);
相关文章:
C/S架构学习之使用select实现TCP小型并发服务器
select实现TCP小型并发服务器的流程:一、创建套接字(socket函数):通信域选择IPV4网络协议、套接字类型选择流式; int sockfd socket(AF_INET,SOCK_STREAM,0); //通信域选择IPV4、套接字类型选择流式二、填充服务器的网…...

公司注册类型分类标准是怎样的
公司法上的分支机构、分公司、子公司是什么 - 公司法 (一)以公司股东的责任范围为标准分类 以公司股东的责任范围为标准,亦即以公司股东是否对公司债务承担责任为标准,可将公司分为无限责任公司、两合公司、股份两合公司、股份有限公司和有限责任公司。…...
5.MidBook项目经验之MongoDB,Nacos,网关
1.医院查询接口 //系统1(signsignMD5加密后) ----> 系统2(数据库signMD5加密 相对比),好处在于网络之间传输不会得到直接得到sign 2.上传和删除科室信息 //map转jsonString,然后再转为对象//保存需要查数据库是否存在,存在修改,不存在添加//接口的包引入不对导致调用引包错误…...
XMLHttpRequest对象的Get请求和Post请求的用法
XMLHttpRequest对象的Get请求和Post请求的用法 Get请求提交数据 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>发送ajax get请求</title> </head> <body> <script type"…...

Tomcat动静分离
访问静态页面和访问动态页面分开,实现动态页面和静态页面的负载均衡 一、七层动静分离 3台虚拟机 1、nginx1既是代理也是静态 nginx1:20.0.0.11 2、请求动态页面:Tomcat1和Tomcat2 Tomcat1:20.0.0.31 Tomcat2:20…...

一些ECharts配置
基于vue3,EChart5.4.3版本 Line <script setup lang"ts"> import {onBeforeUnmount, onMounted, ref, watch} from "vue" import {useEcharts, type ECOption} from "/composables" import * as echarts from "echarts/c…...
C调用Objective-C的类和方法
C调用Objective-C的类和方法 最近有一个C提供回调接口调用Objective-c接口来传递数据的需求,研究了很久,最终通过bing的AI对话查到了需要的内容,这里记录一下,算是给基于C的IOS开发开了一个头。 在Objective-C中,你可…...
驱动开发day1
头文件 #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014#define PHY_LED2_MODER 0x50007000 #define PHY_LED2_ODR 0x50007014#define PHY_LED3_MODER 0x50006000 #define PHY_LED3_ODR 0x50006014#define P…...
C++ linux vscode编译
.cpp .h文件关系与编译命令 单一cpp文件编译多个.cpp文件编译.h头文件和.cpp源文件在同一目录下编译.h头文件和.cpp源文件在不同一目录下编译 单一cpp文件编译 //test.cpp为测试源文件, a.out为输出可执行文件 g test.cpp -o a.out多个.cpp文件编译 目录1结构如下…...

卷积神经网络CNN学习笔记
目录 1.全连接层存在的问题2.卷积运算3.填充(padding)3.1填充(padding)的意义 4.步幅(stride)5.三维数据的卷积运算6.结合方块思考7.批处理8.conv2d代码参考文章 1.全连接层存在的问题 在全连接层中,相邻层的神经元全部连接在一起,输出的数量可以任意决…...
Java的Socket Timeout和tcp的存活探测包是不是一个东西
背景 你有没有好奇过我们在java中通过Socket.setSoTimeout()设置timeout参数时,他怎么做到在timeout时间到了之后连接就报错的?有没有产生过误解,这个参数就是设置keepalive探测包的检测间隔? 问题真相 其实Socket.setSoTimeou…...

基于跳蛛优化的BP神经网络(分类应用) - 附代码
基于跳蛛优化的BP神经网络(分类应用) - 附代码 文章目录 基于跳蛛优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.跳蛛优化BP神经网络3.1 BP神经网络参数设置3.2 跳蛛算法应用 4.测试结果:5.M…...

基于鹈鹕优化的BP神经网络(分类应用) - 附代码
基于鹈鹕优化的BP神经网络(分类应用) - 附代码 文章目录 基于鹈鹕优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.鹈鹕优化BP神经网络3.1 BP神经网络参数设置3.2 鹈鹕算法应用 4.测试结果:5.M…...

『ARM』和『x86』处理器架构解析指南
前言 如果问大家是否知道 CPU,我相信不会得到否定的答案,但是如果继续问大家是否了解 ARM 和 X86 架构,他们的区别又是什么,相信可能部分人就会哑口无言了 目前随着深度学习、高性能计算、NLP、AIGC、GLM、AGI 的技术迭代&#…...
Android 13.0 系统设置 app详情页默认关闭流量数据的开关
1.概述 在13.0的系统产品开发中,移动流量消耗也是关于产品优化的一个方面,由于产品需求需要对app详情页的流量进行管控默认关闭流量开关,不让流量无故流失,所以需要从流量开关分析问题流量打开流程,然后关闭 2.系统设置 app详情页默认关闭流量数据的开关的核心类 package…...

054协同过滤算法的电影推荐系统
大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…...

分享一个基于JavaWeb的私人牙科诊所预约挂号就诊系统的设计与实现项目源码调试 lw 开题 ppt
💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…...
从零开始的C++(十一)
vector的模拟实现: 1.构造函数: vector(){}vector(int n, const T& value T()){ reserve(n);for (int i 0; i < n; i){push_back(value);}}template<class InputIterator>vector(InputIterator first, InputIterator last){ auto it …...

驱动开发day2
通过物理内存映射为虚拟内存 实现三盏LED灯亮灯灭 head.h #ifndef __HEAD_H__ #define __HEAD_H__#define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014 #define PHY_RCC 0x50000A28#define PHY_LED2_MODER 0X50007000 #define PHY_LED2_ODR 0X50007014#defin…...

【CANoe】文件处理_hex文件读取解析
hex文件里面只有00,01,04三种码。那么我们在解析的时候只需要对这三种不同状态的进行不同的解析即可。 hex文件格式的解析,可阅读:HEX文件格式详解 首先创建一个Block的结构体,根据经验我们知道,一个数据…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...