创建一个多进程服务器和多线程服务器
多进程服务器
#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地址//定义信号处理函数,用于回收僵尸进程 void handler(int signo) {if(signo SIGCHLD){while(waitpid(-1, NULL, WNOHAN…...
相机图像质量研究(18)常见问题总结:CMOS期间对成像的影响--CFA
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...
18.谈谈你对JSON的理解
JSON 是一种基于文本的轻量级的数据交换格式。它可以被任何的编程语言读取和作为数据格式来传递。 在项目开发中,使用 JSON 作为前后端数据交换的方式。在前端通过将一个符合 JSON 格式的数据结构序列化为 JSON 字符串,然后将它传递到后端,后…...
绝地求生:“觉醒之旅”通行证曝光,西游主题通行证及成长型武器即将上线
随着27赛季即将结束,有关28.1版本的皮肤及通行证内容也被爆料出来,本次通行证为工坊通行证,和去年四圣兽通行证为同一类型,将于2月7日更新至正式服 除了通行证获取工坊币还是可以开箱获取并兑换一些奖励 先看通行证 四个套装应该分…...
JS如何判断普通函数与异步(async)函数
这里可以先打印一下普通函数和异步(async)函数的结构,如下图 可以看出两者原型链,普通函数的原型链指向的是一个函数,异步(async)函数原型链指向的是一个AsyncFunction,这时就会想到…...
ndk-r20b 编译 boost 1.74。
ndk-r20b 编译 boost 1.74,这是 ndk-r20b 支持得最大 boost 版本,再大就没法编译支持了,本文介绍方法是完整编译,不需要完整编译请转移到github,boost for android 得开源项目。 1.74 boost ,安卓上面得版本…...
尚硅谷最新Node.js 学习笔记(四)
目录 八、express框架 8.1、express介绍 8.2、express使用 express下载 express初体验 8.3、express路由 什么是路由? 路由的使用 获取请求参数 获取路由参数 8.4、express响应设置 8.5、express中间件 什么是中间件? 中间件的作用 中间件…...
掌握XGBoost:GPU 加速与性能优化
导言 XGBoost是一种强大的机器学习算法,但在处理大规模数据时,传统的CPU计算可能会变得缓慢。为了提高性能,XGBoost可以利用GPU进行加速。本教程将介绍如何在Python中使用XGBoost进行GPU加速以及性能优化的方法,并提供相应的代码…...
【2024年毕设系列】如何使用Anaconda和Pycharm
【2024年毕设系列】如何使用Anaconda和Pycharm 视频教程地址:【2024毕设系列】Anaconda和Pycharm如何使用_哔哩哔哩 Hi,各位好久不见,这里是肆十二,首先在这里给大伙拜年了。 诸位过完年之后估计又要开始为了大作业和毕业设计头疼…...
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.课题概述 电力系统可靠性是指电力系统按可接受的质量标准和所需数量不间断地向电力用户供应电力和电能量的能力的量度,包括充裕度和安全性两个方面。发电系统可靠性是指统一并网的全部发电机…...
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 中的一个重要组件,用于提供对模型的控制和调整。以下是 ControlNet 插件的主要特点和功能: 模型控制: ControlNet 允许用户对 Stable Diffusion 中的模型进行精细的控制和调整。用户可以…...
【蓝桥杯单片机入门记录】认识单片机
目录 单片机硬件平台 单片机的发展过程 单片机开发板 单片机基础知识 电平 数字电路中只有两种电平:高和低 二进制(8421码) 十六进制 二进制数的逻辑运算 “与” “或” “异或” 标准C与C51 如何学好单片机 端正学习的态度、培…...
Rust 数据结构与算法:3栈:用栈实现符号匹配
1、符号匹配 如: (56)(78)/(43)、{ { ( [ ] [ ])}}、(ab)(c*d)func() 等各类语句的符号匹配。 这里我们关注的不是数字而是括号,因为括号更改了操作优先级,限定了语言的语义,这是非常重要的。如果括号不完整,那么整个…...
用ESP8266快速实现WIFI红外遥控器(SoC模式)
1,硬件结构图 主要使用了esp8266 wifi模块和红外串口通讯模块。有了红外串口通讯模块,省去了单片机的串口通讯和红外编码程序,大大缩短开发时间。因为红外通讯模块不支持3.3VTTL电平,所以两个模块之间加了一个2路电平转换模块&…...
微服务OAuth 2.1认证授权可行性方案(Spring Security 6)
文章目录 一、背景二、微服务架构介绍三、认证服务器1. 数据库创建2. 新建模块3. 导入依赖和配置4. 安全认证配置类 四、认证服务器测试1. AUTHORIZATION_CODE(授权码模式)1. 获取授权码2. 获取JWT 2. CLIENT_CREDENTIALS(客户端凭证模式) 五、Gateway1.…...
Maui blazor ios 按设备类型设置是否启用safeArea
需求,新做了个app, 使用的是maui blazor技术,里面用了渐变背景,在默认启用SafeArea情况下,底部背景很突兀 由于现版本maui在SafeArea有点bug,官方教程的<ContentPage SafeAreafalse不生效,于…...
C#系列-使用 Minio 做图片服务器实现图片上传 和下载(13)
1、Minio 服务器下载和安装 要在本地安装和运行 MinIO 服务器,你可以按照以下 步骤进行操作: 1. 访问 MinIO 的官方网站:https://min.io/,然后 点击页面上的”Download”按钮。 2. 在下载页面上,选择适合你操作系统的 …...
生活篇——华为手机去除负一屏
华为手机去除如下图的恶心负一屏 打开华为的应用市场app 进入:我的-设置-国家/地区(改为俄罗斯)-进入智慧助手检查更新并更新智慧助手。 然后重复开始的操作,将地区改回中国,这样就没有负一屏了。...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
