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);

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

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

相关文章

Centos 无法连接 WIFI

环境 硬件&#xff1a;ASUS X550VC, x86_64系统&#xff1a;CentOS 7.9 现象 系统安装后无法上网&#xff0c;终端命令提示符为shadow3dlocalhost&#xff0c;我的疑问是这里不是应该显示我的主机名吗&#xff0c;为什么是localhost呢&#xff1f;但是有些时候&#xff0c;又…

蛋白质折叠

文章目录 4. GNNs for Protein foldingChemical Structures as GraphsProtein Structure PredictionMethods for Protein Structure PredictionOld method: fragment assemblyNew StrategyCo-evolution Analysis Towards An End-to-End Workflow AlphaFold2 architecture补充&a…

MySQL:BETWEEN AND操作符的边界

文档原文&#xff1a; expr BETWEEN min AND maxIf expr is greater than or equal to min and expr is less than or equal to max, BETWEEN returns 1, otherwise it returns 0. This is equivalent to the expression (min < expr AND expr < max) if all the argume…

水管安装过滤器笔记

文章目录 方案准备工具剪管钳热熔器软管接头及单向阀扳手 操作过程花洒 搬家后&#xff0c;水质不行&#xff0c;洗脸掉皮&#xff0c;洗头以前不掉头皮屑的&#xff0c;居然也掉头皮屑。有必要简单过滤下了。 水质情况&#xff0c;并不是脏脏的的那种水&#xff0c;看上去还比…

QString字符串判断是否包含中文

目的 QString判断是否包含中文。 实现方式 可以通过以下两种方式实现&#xff1a; 逐一取QString的字符&#xff0c;判断其Unicode码位是否处于中文的范围之内。具体代码实现如下&#xff1a; QString str; int nCount str.count(); bool containsChinese false; …

檀香香料经营商城小程序的作用是什么

檀香香料有安神、驱蚊、清香等作用&#xff0c;办公室或家庭打坐等场景&#xff0c;都有较高的使用频率&#xff0c;不同香料也有不同效果&#xff0c;高品质香料檀香也一直受不少消费者欢迎。 线下流量匮乏&#xff0c;又难以实现全消费路径完善&#xff0c;线上是商家增长必…

uniapp无感刷新token实现过程

路漫漫其修远兮&#xff0c;前端道路逐渐迷茫&#xff0c;时隔好久好久终于想起了我还有一个小博客&#xff0c;最近在一直在弄uniapp&#xff0c;属实有被恶心到&#xff0c;但也至少会用了&#xff0c;最近实现了一个比较通用的功能&#xff0c;就是无感刷新token&#xff0c…

【已解决】ubuntu耳机单侧有声音

背景 台式机&#xff0c;双系统&#xff1a;win10 ubuntu 20.04&#xff1b;ubuntu 系统当中&#xff0c;左侧耳机有声音&#xff0c;右侧没有&#xff1b; 解决方法 终端输入&#xff1a;alsamixer&#xff0c;显示下面的图片&#xff1a; 调整方法&#xff1a;键盘上下左…

一例jse蠕虫的分析

概述 这是一例jse格式的蠕虫病毒&#xff0c;会隐藏系统中所有的doc、docx和rtf文件&#xff0c;创建同名的.jse文件&#xff0c;诱导用户点击执行&#xff0c;通过感染U盘和网络驱动器、光盘刻录临时文件夹、html文件进行传播。 这个样本是使用JScript语言编写的加密脚本文件…

zabbix-proxy代理服务器配置

下载zabbix源 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm 安装 yum -y install zabbix-proxy-mysql zabbix_get 查看相关文件路径 rpm -ql zabbix-proxy-mysql 创建数据库 mysq -uroot -proot mysql> create database…

算法通关村第一关|黄金挑战|链表中的环问题双向链表

1.链表中环的问题 1.1 判断是否有环&#xff1a;使用集合处理&#xff0c;判断是否碰撞。 public ListNode detectCycle(ListNode head) {ListNode pos head;Set<ListNode> visited new HashSet<ListNode>();while (pos ! null) {if (visited.contains(pos)) {…

ElementPlus表格中的背景透明

ElementPlus表格中的背景透明 最近写大屏&#xff0c;用到elementplus中的el-table&#xff0c;为了让显示效果好看一点&#xff0c;需要把表格的白色背景调整为透明&#xff0c;与整个背景融为一体。可以参考的资料非常少&#xff0c;大部分都是ElmentUI的方法&#xff0c;在…

Gradient conjugate priors and multi-layer neural networks

动机 先验参数 m , α , β , v m,\alpha,\beta,v m,α,β,v和随机变量 τ \tau τ KL散度的形式是&#xff1a; Dynamics of m , α , β , v m,\alpha,\beta,v m,α,β,v Dynamics of m , β , v m,\beta,v m,β,v for a fixed α \alpha α 绿色轨迹连接初始点和目标点…

KVM动态在线迁移实操笔录

环境介绍 一台NFS&#xff08;192.168.184.132&#xff09; 一台KVM-a&#xff08;192.168.184.133&#xff09; 一台KVM-b&#xff08;192.168.184.134&#xff09; NFS配置 [rootlocalhost ~]# setenforce 0 //关闭selinux [rootlocalhost ~]# service iptables stop [root…

ZKP5.1 Plonk Interactive Oracle Proofs (KZG‘10)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 5: The Plonk SNARK (Dan Boneh) 5.1 KZG’10 general SNARK A polynomial commitment scheme A polynomial interactive oracle proof (IOP) Review: polynomial commitments The KZG poly-commit scheme commit a bind…

【网络协议】聊聊ICMP与ping是如何测试网络联通性

ICMP协议格式 ping是基于iCMP协议工作的&#xff0c;ICMP全称Internet Control Message Protocol&#xff0c;就是互联网控制报文协议。其实就是有点类似于古代行军打仗&#xff0c;哨探进行前方探明具体情况。 IMCP本身处于网络层&#xff0c;将报文封装在IP包里&#xff0c;…

【Datawhale】扩散模型学习笔记 第一次打卡

文章目录 扩散模型学习笔记1. 扩散模型库Diffusers1.1 安装1.2 使用 2. 从零开始搭建扩散模型2.1 数据准备2.2 损坏过程2.3 模型构建2.4 模型训练2.5 采样 3. webui 扩散模型学习笔记 1. 扩散模型库Diffusers 1.1 安装 由于diffusers库更新较快&#xff0c;所以建议时常upgr…

矩阵系统功能/如何操作

矩阵系统是一种广泛应用于企业管理、组织结构设计和战略制定领域的系统。它是由多个因素相互作用而形成的网络&#xff0c;旨在实现特定的组织目标。矩阵系统的主要特点是将不同功能和区域的部分组合在一起&#xff0c;形成一个完整的系统&#xff0c;从而更好地满足组织的需求…

04、MySQL-------MyCat实现分库分表

目录 九、MyCat实现分库分表1、分库分表介绍&#xff1a;横向&#xff08;水平&#xff09;拆分**垂直分表**&#xff1a;水平分表&#xff1a;**分库分表** 纵向&#xff08;垂直&#xff09;拆分分表字段选择 2、分库分表操作&#xff1a;1、分析图&#xff1a;2、克隆主从3、…

QT中窗口自绘制效果展示

项目中需要使用QT进行窗口自绘&#xff0c;前期先做一下技术探索&#xff0c;参考相关资料代码熟悉流程。本着代码是最好的老师原则&#xff0c;在此记录一下。 目录 1.运行效果 2.代码结构 3.具体代码 1.运行效果 2.代码结构 3.具体代码 myspeed.pro QT core gui…