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

创建一个多进程服务器和多线程服务器

多进程服务器

#include<myhead.h>
#define PORT 8888                  //端口号
#define IP "192.168.10.10"        //IP地址//定义信号处理函数,用于回收僵尸进程
void handler(int signo)
{if(signo == SIGCHLD){while(waitpid(-1, NULL, WNOHANG) > 0 );}
}//定义处理客户端操作的函数
int deal_cli_msg(int newfd, struct sockaddr_in cin)
{//5、收发数据char rbuf[128] = "";    //读取消息的容器while(1){//清空内容bzero(rbuf, sizeof(rbuf));int res = recv(newfd, rbuf, sizeof(rbuf), 0);if(res == 0){printf("客户端下线\n");break;}printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);}close(newfd);return 0;
}int main(int argc, const char *argv[])
{//将SIGCHLD信号与信号处理函数进行绑定if(signal(SIGCHLD, handler) == SIG_ERR){perror("signal error");return -1;}int sfd = -1;if((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket error");return -1;}printf("sfd = %d\n", sfd);    //设置端口号快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1){perror("setsockopt error");return -1;}struct sockaddr_in sin;sin.sin_family =     AF_INET;   //地址族为IPv4sin.sin_port =         htons(PORT);    //端口号,需要转换网络字节序sin.sin_addr.s_addr = inet_addr(IP);  //IP地址if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}if(listen(sfd, 128) == -1){perror("listen error");return -1;}struct sockaddr_in cin;socklen_t socklen = sizeof(cin);                //接收长度int newfd = -1;         //用于跟客户端通信的套接字文件描述符pid_t pid = -1;          //接收子进程pid号while(1){if( (newfd=accept(sfd, (struct sockaddr*)&cin, &socklen)) == -1){perror("accept error");return -1;}printf("[%s:%d] 连接成功, newfd = %d\n", inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port), newfd);            //创建子进程用于跟新的客户端进行通信工作pid = fork();if(pid > 0){//父进程用于接收客户端连接请求//父进程中关闭newfdclose(newfd);}else if(pid == 0){//关闭sfdclose(sfd);//调用处理客户端信息的函数deal_cli_msg(newfd, cin);//退出子进程exit(EXIT_SUCCESS);}else {perror("fork error");return -1;}}//关闭套接字close(sfd);return 0;
}

多线程服务器

#include<myhead.h>
#define PORT 8888                  //端口号
#define IP "192.168.10.10"        //IP地址//定义向线程体中传递参数的结构体类型
struct pthread_ds
{int newfd;          //处理客户端的套接字文件描述符struct sockaddr_in cin;       //客户端套接字地址信息结构体变量
};//定义线程处理函数
void *deal_cli_msg(void *arg)
{//分解传过来的参数int newfd = ((struct pthread_ds*)arg)->newfd;     struct sockaddr_in cin = ((struct pthread_ds*)arg)->cin;//5、收发数据char rbuf[128] = "";    //读取消息的容器while(1){//清空内容bzero(rbuf, sizeof(rbuf));int res = recv(newfd, rbuf, sizeof(rbuf), 0);if(res == 0){printf("客户端下线\n");break;}}close(newfd);//退出线程pthread_exit(NULL);}int main(int argc, const char *argv[])
{//1、创建套接字int sfd = -1;if((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket error");return -1;}printf("sfd = %d\n", sfd);     //设置端口号快速重用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))==-1){perror("setsockopt error");return -1;}//2、绑定地址信息结构体(必须)//2.1 填充地址信息结构体struct sockaddr_in sin;sin.sin_family =     AF_INET;   //地址族为IPv4sin.sin_port =         htons(PORT);    //端口号,需要转换网络字节序sin.sin_addr.s_addr = inet_addr(IP);  //IP地址//2.2绑定工作if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}//3、将套接字设置成被动监听状态if(listen(sfd, 128) == -1){perror("listen error");return -1;}//4、接收链接请求//4.1 定义用于接收客户端地址信息的结构体变量struct sockaddr_in cin;socklen_t socklen = sizeof(cin);                //接收长度//4.2 接收客户端链接请求int newfd = -1;         //用于跟客户端通信的套接字文件描述符pthread_t tid = -1;       //接收线程号while(1){//接收客户端链接请求if( (newfd=accept(sfd, (struct sockaddr*)&cin, &socklen)) == -1){perror("accept error");return -1;}printf("[%s:%d] 连接成功, newfd = %d\n", inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port), newfd);             //?//定义一个向线程体传递的结构体变量struct pthread_ds info = {newfd, cin};//创建一个分支线程,用于跟客户端进行通信if(pthread_create(&tid, NULL, deal_cli_msg, &info) != 0){printf("tid create error\n");return -1;}//回收线程资源//pthread_join(tid);    //不能使用阻塞形式回收线程资源pthread_detach(tid);        //将线程设置成分离态}//关闭套接字close(sfd);return 0;
}

相关文章:

创建一个多进程服务器和多线程服务器

多进程服务器 #include<myhead.h> #define PORT 8888 //端口号 #define IP "192.168.10.10" //IP地址//定义信号处理函数&#xff0c;用于回收僵尸进程 void handler(int signo) {if(signo SIGCHLD){while(waitpid(-1, NULL, WNOHAN…...

相机图像质量研究(18)常见问题总结:CMOS期间对成像的影响--CFA

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…...

18.谈谈你对JSON的理解

JSON 是一种基于文本的轻量级的数据交换格式。它可以被任何的编程语言读取和作为数据格式来传递。 在项目开发中&#xff0c;使用 JSON 作为前后端数据交换的方式。在前端通过将一个符合 JSON 格式的数据结构序列化为 JSON 字符串&#xff0c;然后将它传递到后端&#xff0c;后…...

绝地求生:“觉醒之旅”通行证曝光,西游主题通行证及成长型武器即将上线

随着27赛季即将结束&#xff0c;有关28.1版本的皮肤及通行证内容也被爆料出来&#xff0c;本次通行证为工坊通行证&#xff0c;和去年四圣兽通行证为同一类型&#xff0c;将于2月7日更新至正式服 除了通行证获取工坊币还是可以开箱获取并兑换一些奖励 先看通行证 四个套装应该分…...

JS如何判断普通函数与异步(async)函数

这里可以先打印一下普通函数和异步&#xff08;async&#xff09;函数的结构&#xff0c;如下图 可以看出两者原型链&#xff0c;普通函数的原型链指向的是一个函数&#xff0c;异步&#xff08;async&#xff09;函数原型链指向的是一个AsyncFunction&#xff0c;这时就会想到…...

ndk-r20b 编译 boost 1.74。

ndk-r20b 编译 boost 1.74&#xff0c;这是 ndk-r20b 支持得最大 boost 版本&#xff0c;再大就没法编译支持了&#xff0c;本文介绍方法是完整编译&#xff0c;不需要完整编译请转移到github&#xff0c;boost for android 得开源项目。 1.74 boost &#xff0c;安卓上面得版本…...

尚硅谷最新Node.js 学习笔记(四)

目录 八、express框架 8.1、express介绍 8.2、express使用 express下载 express初体验 8.3、express路由 什么是路由&#xff1f; 路由的使用 获取请求参数 获取路由参数 8.4、express响应设置 8.5、express中间件 什么是中间件&#xff1f; 中间件的作用 中间件…...

掌握XGBoost:GPU 加速与性能优化

导言 XGBoost是一种强大的机器学习算法&#xff0c;但在处理大规模数据时&#xff0c;传统的CPU计算可能会变得缓慢。为了提高性能&#xff0c;XGBoost可以利用GPU进行加速。本教程将介绍如何在Python中使用XGBoost进行GPU加速以及性能优化的方法&#xff0c;并提供相应的代码…...

【2024年毕设系列】如何使用Anaconda和Pycharm

【2024年毕设系列】如何使用Anaconda和Pycharm 视频教程地址&#xff1a;【2024毕设系列】Anaconda和Pycharm如何使用_哔哩哔哩 Hi&#xff0c;各位好久不见&#xff0c;这里是肆十二&#xff0c;首先在这里给大伙拜年了。 诸位过完年之后估计又要开始为了大作业和毕业设计头疼…...

Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor OIDC 单点登录授权实例2-登录信息组件wasmBlazor OIDC 单点登录授权实例3-服务端管理组件Blazor OIDC 单点登录授权实例4 …...

基于蒙特卡洛的电力系统可靠性分析matlab仿真,对比EDNS和LOLP

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 1.课题概述 电力系统可靠性是指电力系统按可接受的质量标准和所需数量不间断地向电力用户供应电力和电能量的能力的量度&#xff0c;包括充裕度和安全性两个方面。发电系统可靠性是指统一并网的全部发电机…...

Spring boot整合redisson报错

Spring boot整合redisson报错 org.redisson.client.RedisConnectionException: Unable to connect to Redis server: localhost/127.0.0.1:6379 原因 原因是计算机连接不上redis导致的 解决方案 重启redis 在redis文件目录下打开cmd 1.检查redis是否在运行 redis-cli p…...

【AIGC】Stable Diffusion的ControlNet插件

ControlNet 介绍 ControlNet 插件是 Stable Diffusion 中的一个重要组件&#xff0c;用于提供对模型的控制和调整。以下是 ControlNet 插件的主要特点和功能&#xff1a; 模型控制&#xff1a; ControlNet 允许用户对 Stable Diffusion 中的模型进行精细的控制和调整。用户可以…...

【蓝桥杯单片机入门记录】认识单片机

目录 单片机硬件平台 单片机的发展过程 单片机开发板 单片机基础知识 电平 数字电路中只有两种电平&#xff1a;高和低 二进制&#xff08;8421码&#xff09; 十六进制 二进制数的逻辑运算 “与” “或” “异或” 标准C与C51 如何学好单片机 端正学习的态度、培…...

Rust 数据结构与算法:3栈:用栈实现符号匹配

1、符号匹配 如&#xff1a; (56)(78)/(43)、{ { ( [ ] [ ])}}、(ab)(c*d)func() 等各类语句的符号匹配。 这里我们关注的不是数字而是括号&#xff0c;因为括号更改了操作优先级&#xff0c;限定了语言的语义&#xff0c;这是非常重要的。如果括号不完整&#xff0c;那么整个…...

用ESP8266快速实现WIFI红外遥控器(SoC模式)

1&#xff0c;硬件结构图 主要使用了esp8266 wifi模块和红外串口通讯模块。有了红外串口通讯模块&#xff0c;省去了单片机的串口通讯和红外编码程序&#xff0c;大大缩短开发时间。因为红外通讯模块不支持3.3VTTL电平&#xff0c;所以两个模块之间加了一个2路电平转换模块&…...

微服务OAuth 2.1认证授权可行性方案(Spring Security 6)

文章目录 一、背景二、微服务架构介绍三、认证服务器1. 数据库创建2. 新建模块3. 导入依赖和配置4. 安全认证配置类 四、认证服务器测试1. AUTHORIZATION_CODE&#xff08;授权码模式&#xff09;1. 获取授权码2. 获取JWT 2. CLIENT_CREDENTIALS(客户端凭证模式) 五、Gateway1.…...

Maui blazor ios 按设备类型设置是否启用safeArea

需求&#xff0c;新做了个app&#xff0c; 使用的是maui blazor技术&#xff0c;里面用了渐变背景&#xff0c;在默认启用SafeArea情况下&#xff0c;底部背景很突兀 由于现版本maui在SafeArea有点bug&#xff0c;官方教程的<ContentPage SafeAreafalse不生效&#xff0c;于…...

C#系列-使用 Minio 做图片服务器实现图片上传 和下载(13)

1、Minio 服务器下载和安装 要在本地安装和运行 MinIO 服务器&#xff0c;你可以按照以下 步骤进行操作&#xff1a; 1. 访问 MinIO 的官方网站&#xff1a;https://min.io/&#xff0c;然后 点击页面上的”Download”按钮。 2. 在下载页面上&#xff0c;选择适合你操作系统的 …...

生活篇——华为手机去除负一屏

华为手机去除如下图的恶心负一屏 打开华为的应用市场app 进入&#xff1a;我的-设置-国家/地区&#xff08;改为俄罗斯&#xff09;-进入智慧助手检查更新并更新智慧助手。 然后重复开始的操作&#xff0c;将地区改回中国&#xff0c;这样就没有负一屏了。...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

结构化文件管理实战:实现目录自动创建与归类

手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题&#xff0c;进而引发后续程序异常。使用工具进行标准化操作&#xff0c;能有效降低出错概率。 需要快速整理大量文件的技术用户而言&#xff0c;这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB&#xff0c;…...