当前位置: 首页 > news >正文

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小型并发服务器的流程&#xff1a;一、创建套接字&#xff08;socket函数&#xff09;&#xff1a;通信域选择IPV4网络协议、套接字类型选择流式&#xff1b; int sockfd socket(AF_INET,SOCK_STREAM,0); //通信域选择IPV4、套接字类型选择流式二、填充服务器的网…...

公司注册类型分类标准是怎样的

公司法上的分支机构、分公司、子公司是什么 - 公司法 (一)以公司股东的责任范围为标准分类 以公司股东的责任范围为标准&#xff0c;亦即以公司股东是否对公司债务承担责任为标准&#xff0c;可将公司分为无限责任公司、两合公司、股份两合公司、股份有限公司和有限责任公司。…...

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动静分离

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

一些ECharts配置

基于vue3&#xff0c;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接口来传递数据的需求&#xff0c;研究了很久&#xff0c;最终通过bing的AI对话查到了需要的内容&#xff0c;这里记录一下&#xff0c;算是给基于C的IOS开发开了一个头。 在Objective-C中&#xff0c;你可…...

驱动开发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为测试源文件&#xff0c; 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.全连接层存在的问题 在全连接层中&#xff0c;相邻层的神经元全部连接在一起&#xff0c;输出的数量可以任意决…...

Java的Socket Timeout和tcp的存活探测包是不是一个东西

背景 你有没有好奇过我们在java中通过Socket.setSoTimeout()设置timeout参数时&#xff0c;他怎么做到在timeout时间到了之后连接就报错的&#xff1f;有没有产生过误解&#xff0c;这个参数就是设置keepalive探测包的检测间隔&#xff1f; 问题真相 其实Socket.setSoTimeou…...

基于跳蛛优化的BP神经网络(分类应用) - 附代码

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

基于鹈鹕优化的BP神经网络(分类应用) - 附代码

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

『ARM』和『x86』处理器架构解析指南

前言 如果问大家是否知道 CPU&#xff0c;我相信不会得到否定的答案&#xff0c;但是如果继续问大家是否了解 ARM 和 X86 架构&#xff0c;他们的区别又是什么&#xff0c;相信可能部分人就会哑口无言了 目前随着深度学习、高性能计算、NLP、AIGC、GLM、AGI 的技术迭代&#…...

Android 13.0 系统设置 app详情页默认关闭流量数据的开关

1.概述 在13.0的系统产品开发中,移动流量消耗也是关于产品优化的一个方面,由于产品需求需要对app详情页的流量进行管控默认关闭流量开关,不让流量无故流失,所以需要从流量开关分析问题流量打开流程,然后关闭 2.系统设置 app详情页默认关闭流量数据的开关的核心类 package…...

054协同过滤算法的电影推荐系统

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…...

分享一个基于JavaWeb的私人牙科诊所预约挂号就诊系统的设计与实现项目源码调试 lw 开题 ppt

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…...

从零开始的C++(十一)

vector的模拟实现&#xff1a; 1.构造函数&#xff1a; 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&#xff0c;01&#xff0c;04三种码。那么我们在解析的时候只需要对这三种不同状态的进行不同的解析即可。 hex文件格式的解析&#xff0c;可阅读&#xff1a;HEX文件格式详解 首先创建一个Block的结构体&#xff0c;根据经验我们知道&#xff0c;一个数据…...

别再只盯着FR4了!PCB板材选型避坑指南:从DK、Tg到CTE,手把手教你读懂关键参数

PCB板材选型实战指南&#xff1a;从参数解析到场景化决策 在高速数字电路和射频系统设计中&#xff0c;板材选择往往成为项目成败的关键变量。当信号速率突破10Gbps&#xff0c;当工作环境温度跨越-40℃到125℃的工业级范围&#xff0c;传统FR4的局限性开始显现。我曾亲眼见证过…...

3步完成视频字幕提取:Video-subtitle-extractor让本地OCR识别变得简单高效

3步完成视频字幕提取&#xff1a;Video-subtitle-extractor让本地OCR识别变得简单高效 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字…...

别再死记硬背了!用Python代码可视化理解离散数学核心概念

用Python代码可视化理解离散数学核心概念 离散数学常被视为计算机科学中最抽象的学科之一&#xff0c;但它的每个概念都对应着现实世界中的具体问题。传统学习方式往往陷入符号和定义的泥沼&#xff0c;而今天我们换一种方式——用Python代码将这些抽象概念转化为可视化的图形和…...

Proteus 8.9 + Arduino UNO 仿真避坑指南:手把手搭建一个会转电机的气压监测系统

Proteus 8.9与Arduino UNO联合仿真实战&#xff1a;从零搭建智能气压控制系统 在电子设计自动化领域&#xff0c;Proteus与Arduino的结合为硬件原型开发提供了高效验证方案。本文将带您完整实现一个融合气压监测、电机控制与串口通信的智能系统仿真&#xff0c;特别针对那些官方…...

从“叛逆八人帮”到硅谷摇篮:聊聊Fairchild仙童那些不为人知的创业故事与技术遗产

硅谷基因解码&#xff1a;仙童半导体如何用"叛逆DNA"重塑科技创业生态 1957年9月18日&#xff0c;加州山景城一间简陋的办公室里&#xff0c;八位年轻人围坐在折叠桌旁签署了一份改变科技史的文件。他们刚刚从诺贝尔奖得主威廉肖克利的实验室集体辞职&#xff0c;被愤…...

保姆级教程:在YOLOv8的C2f、SPPF等不同位置插入SE模块,哪种效果最好?

YOLOv8架构中SE模块插入位置的深度实验指南 在计算机视觉领域&#xff0c;注意力机制已经成为提升模型性能的关键技术之一。SE&#xff08;Squeeze-and-Excitation&#xff09;模块作为一种轻量级且高效的注意力机制&#xff0c;能够显著增强模型对重要特征的关注能力。本文将深…...

告别系统自带!用Qt 5.15手搓一个工业触摸屏专用软键盘(附完整源码)

工业级Qt软键盘开发实战&#xff1a;从零构建高可用触摸屏输入方案 在工业控制、医疗设备和自助终端等专业场景中&#xff0c;传统的Windows软键盘往往成为用户体验的短板——按钮尺寸不符合人机工程学、界面风格与工业UI格格不入、缺乏必要的容错设计。我曾参与过多个工业HMI项…...

TranslucentTB:让Windows任务栏焕发个性的透明艺术

TranslucentTB&#xff1a;让Windows任务栏焕发个性的透明艺术 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 你是否厌倦了Windows任务栏…...

政府如何提升科技成果转化效率?

观点作者&#xff1a;科易网-国家科技成果转化&#xff08;厦门&#xff09;示范基地现状概述&#xff1a;成效与短板 在科技创新驱动高质量发展的新时代&#xff0c;科技成果转化已成为衡量区域创新能力和产业升级水平的关键指标。近年来&#xff0c;我国政府高度重视科技成果…...

LM文生图效果展示:支持长尾提示词理解,如‘vintage 1920s flapper dress’

LM文生图效果展示&#xff1a;支持长尾提示词理解&#xff0c;如vintage 1920s flapper dress 1. 惊艳效果预览 LM文生图模型能够精准理解复杂的长尾提示词&#xff0c;生成高质量图像。以"vintage 1920s flapper dress"为例&#xff0c;模型不仅能准确呈现1920年代…...