网络编程,IO多路复用
1.使用IO多路复用完成TCP并发服务器
#include<myhead.h>
#define SER_PORT 8888 //服务器端口号
#define SER_IP "192.168.124.10" //服务器IP地址int main(int argc, const char *argv[])
{//1、创建用于连接的套接字int sfd = socket(AF_INET, SOCK_STREAM, 0); //参数1:通信域,表明使用的是ipv4协议//参数2:通信方式,使用TCP通信//参数3:0表示之前已经指定协议 IPPROTO_TCPif(sfd == -1){perror("socket error");return -1;}printf("sfd = %d\n", sfd); //3//将端口号快速重用函数int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//2、给当前套接字绑定IP地址和端口号//2.1填充要绑定的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET; //通信域sin.sin_port = htons(SER_PORT); //端口号sin.sin_addr.s_addr = inet_addr(SER_IP); //ip地址//2.2 绑定if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success %s %s %d\n", __FILE__, __func__, __LINE__);//3、将套接字设置成监听状态if(listen(sfd, 128) == -1){perror("listen error");return -1;}printf("listen success %s %s %d\n", __FILE__, __func__, __LINE__);//4、阻塞等待客户端的链接请求//4.1定义容器接收客户端的地址信息struct sockaddr_in cin; //用于接收地址信息socklen_t socklen = sizeof(cin); //用于接收地址信息的大小int newfd = -1;//11、准备一个文件描述符容器fd_set readfds, tempfds; //22、清空容器FD_ZERO(&readfds);//33、将要检测的文件描述符放入集合FD_SET(0, &readfds);FD_SET(sfd, &readfds);//定义一个变量存储容器中最大的文件描述符int maxfd = sfd;//定义一个地址信息结构体数组,每一个元素对应一个客户端文件描述符struct sockaddr_in cin_arr[1024];while(1){tempfds = readfds; //存储一份数据//使用select函数对容器中的文件描述符进行检测int res = select(maxfd+1,&tempfds,NULL,NULL,NULL);if(res == -1){perror("select error");return -1;}else if(res == 0){printf("timeout\n");return -1;}//判断是否是文件描述符触发事件for(int cli=0;cli<=maxfd;cli++){if(!FD_ISSET(cli,&tempfds)){continue;}if(cli == sfd){//4.2 接收客户端的链接newfd = accept(sfd, (struct sockaddr*)&cin, &socklen); if(newfd == -1){perror("accept error");return -1;}printf("[%s:%d]发来链接请求 %s %s %d\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port),__FILE__, __func__, __LINE__);//更新地址信息结构体数组cin_arr[newfd] = cin;//将newfd放入readfds中FD_SET(newfd, &readfds);//更新maxfdif(newfd > maxfd){maxfd = newfd;}}else//判断0号文件描述符是否在集合中if(cli == 0){//终端输入char wbuf[128] = "";scanf("%s", wbuf);printf("触发了终端输入事件。。。\n");if(strcmp(wbuf, "quit") == 0){goto END;}//将消息发送给所有客户端for(int i=4; i<=maxfd; i++ ){sendto(i, wbuf, sizeof(wbuf), 0,(struct sockaddr*) &cin_arr[i], sizeof(cin_arr[i]));}}else{//5、跟客户端进行消息通信char buf[128] = "";//将数组清空bzero(buf, sizeof(buf));//读取客户端发来的消息//int res = read(newfd, buf, sizeof(buf));int res = recv(cli, buf, sizeof(buf), 0);if(res == 0){printf("客户端已经下线\n");//关闭当前通信的套接字close(cli);//将当前文件描述符从文件描述符集合中移除FD_CLR(cli, &readfds);//更新maxfdfor(int i=maxfd; i>=sfd; i--){if(FD_ISSET(i, &readfds)){maxfd = i;break;}}continue;}printf("[%s:%d] : %s\n", inet_ntoa(cin_arr[cli].sin_addr), ntohs(cin_arr[cli].sin_port), buf);//给客户端发消息strcat(buf, "*_*");//write(newfd, buf, sizeof(buf));send(cli, buf, sizeof(buf), 0);printf("发送成功\n");}}}END://6、关闭套接字close(sfd);return 0;}
相关文章:

网络编程,IO多路复用
1.使用IO多路复用完成TCP并发服务器 #include<myhead.h> #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.124.10" //服务器IP地址int main(int argc, const char *argv[]) {//1、创建用于连接的套接字int sfd socket…...

【ue5】滑铲系统蓝图笔记
大致逻辑如下: 一、导入动画 滑铲蹲待机蹲行走 导入到文件夹中 可以右键设置颜色,便于区分。 二、调整动画 1.启动根运动 启动根运动后,人物才可以位移,不然只能在原地。 打开动画序列,勾选启用根运动Enabled…...

linux系统Jenkins工具参数化构建
Jenkins参数化构建 web服务器jenkins服务器编写主机清单编写脚本代码 jenkins服务web页面操作 web服务器 下载nginx 下载gitcd /usr/share/nginxrm -rf htmlgit clone http://root:Qq123456192.168.188.176/ximu/test-nginx.gitmv test-nginx/ htmljenkins服务器 下载ansible…...
生活里的英语应该【怎么说】
文章目录 一、生病的各种症状用英语怎么说?二、关于天气的英语怎么说? 一、生病的各种症状用英语怎么说? Im coughting! I have a sore throat. Ive lost my voice. I have a runny nose and a stuffy nose. I have shivers and a body a…...

Centos安装Jenkins
1、更新系统 (1)更新下系统 sudo yum -y update 安装用于下载java 17二进制文件的wget命令行工具 sudo yum -y install wget vim 2、卸载centos自带的jdk 由于我们安装的版本比较高,需要jdk17,卸载centos自带的jdk。用 下面的…...
软考中级系统集成必备100题(71-80)真题精炼
文章目录 71.简述配置管理的主要活动?72.配置管理和变更管理的区别?73.CMO的具体工作有哪些?74.配置标识的基本内容由哪些?75.配置审计包括哪些内容?76.配置审计的功能是什么?77.为什么要进行配置项的版本控制?78.简述配置项的版本控制流…...
visual studio的使用
文章目录 1.visual studio要加的宏命令2.清屏操作 1.visual studio要加的宏命令 #define _CRT_SECURE_NO_WARNINGS这是一个预处理器宏,它在 Visual Studio 中被广泛使用。其主要目的是禁用一些在 C 和 C 标准库中被认为不安全的函数的编译器警告。这些不安全的函数…...

对于爬虫的学习
本地爬取 package MyApi.a08regexdemo;import java.util.regex.Matcher; import java.util.regex.Pattern;public class RegexDemo03 {public static void main(String[] args) {//要求:找出里面所有javaxxString str"Java自从95年问世以来,经历了…...

【学习笔记】开源计算机视觉库OPENCV学习方案
本文中,我们试图提供一些学习OpenCV的详细和实用资源,这些资源包括基础知识、进阶技巧以及实践项目,旨在帮助初学者和进阶学习者更好地掌握和使用OpenCV库。 一、学习资源 官方文档:OpenCV的官方文档是学习OpenCV的最佳起点。它包…...

LVS负载均衡集群基础概念
目录 一、集群 1、集群概述 1.1 什么是集群 1.2 集群系统扩展方式 1.2.1 Scale UP(纵向扩展): 1.2.2 Scale OUT(横向扩展): 1.2.3 区别 1.3 分布式系统 1.4 分布式与集群 1.5 集群设计原则 1.6 …...
pwn学习笔记(5)--格式化字符串漏洞(未完全完成)
pwn学习笔记(5)–格式化字符串漏洞 前言:由于条件有限,因此对于该漏洞的学习不算很多, 格式化字符串漏洞基础: 格式化字符串介绍: 格式化字符串函数可以接收可变数量的参数࿰…...

HTML标签之表单标签,web开发实例教程
标签语义化: 语义和默认样式的区别: 默认样式是浏览器设定的一些常用tag的表现形式;语义化的主要目的就是让大家直观的认识标签和属性的用途和作用; 标签语义化作用: 当只有HTML页面时,没有CSS…...
数据库-第四/五章 数据库安全性和完整性【期末复习|考研复习】
前言 总结整理不易,希望大家点赞收藏。 给大家整理了一下计数据库系统概论中的重点概念,以供大家期末复习和考研复习的时候使用。 参考资料是王珊老师和萨师煊老师的数据库系统概论(第五版)。 文章目录 前言4 第四章 数据库安全性4.1 数据库安全性定义4.…...

网站维护页面404源码
网站维护页面404源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 下载地址 https://www.qqmu.com/2407.html...

CSS的文本样式属性值,web开发难点
什么是css块元素? 块级元素是独占一行显示的。它的兄弟元素必定不会与其在同一行中(除非脱离了文档流)。通俗点来说,就是块元素(block element)一般是其他元素的容器元素 戳这里领取完整开源项目:【一线大厂前端面试题…...

springboot+jsp汽车配件管理系统idea maven 项目lw
springbootweb汽车配件销售业绩管理系统服务于汽车配件公司业务,实现了客户管理,主要负责对客户相关数据的增删改查方面、渠道管理,主要对渠道信息也就是设备的供应商渠道信息进行管理、项目管理,主要是一些项目信息的记录与整理、销售数据管…...

计算机网络-网络安全(二)
1.应用层安全协议: S-HTTP或SHTTP(Sec HTTP),安全超文本传输协议,是HTTP扩展,使用TCP的80端口。HTTPS:HTTPSSL,使用TCP的443端口。和TLS(传输层安全标准)是双…...
Flutter App代码混淆
Flutter 应用混淆 Flutter 应用的混淆非常简单,只需要在构建 release 版应用时结合使用 --obfuscate 和 --split-debug-info 这两个参数即可。 flutter build apk –obfuscate --split-debug-info 命令需要指定输出调试文件的位置,该命令会生成一个符号映…...
pandas中apply函数的坑——错误信息Must provide ‘func‘ or tuples of ‘(column, aggfunc)的解决办法
近期需要获取某网站上的文章标题,并对文章来源以及不同来源的文章数量进行分析。已通过爬虫完成对文章标题、日期和文章链接的爬取,并存入pandas中的dataframe中,准备进行下一步的分析。 该网站一般情况下,文章标题前两个字是信息…...

《操作系统真相还原》读书笔记二:环境搭建 xshell连接virtualbox
修改 sshd_config 使用 vi /etc/ssh/sshd_config命令进入sshd服务配置,键盘输入i进行编辑,将监听端口、监听地址前的 # 号去除,开启允许远程登录,开启使用用户名密码来作为连接验证。修改完成,按一下Esc,输…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...