十八、TCP多线程、多进程并发服务器
1、TCP多线程并发服务器
服务端:
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <strings.h>
#define QUIT_STR "QUIT"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128"
#define bufsize 1024
void* cilent_data_handle(void* arg)
{int newfd=*(int *)arg;char buf[bufsize];printf("thread handle:newfd = %d\n",newfd);int ret =-1;while(1){do{bzero(buf,bufsize);ret=read(newfd,buf,bufsize-1);}while(ret<1);if(ret<0){exit(1);}if(!ret){break;}printf("recive data is %s\n",buf);if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){printf("cilenr is exiting!\n");break;}}close(newfd);}
int main()
{int fd=-1;fd=socket(AF_INET,SOCK_STREAM,0);if(fd == -1){perror("socket");exit(1);}struct sockaddr_in sin;bzero(&sin,sizeof(sin));sin.sin_family=AF_INET;sin.sin_port = htons(SERV_IP);sin.sin_addr.s_addr = INADDR_ANY;
/* if(inet_pton(AF_INET,SERV_IP_ADDR,(void*)&sin.sin_addr.s_addr)!=1){perror("inet_pton");exit(1);}*///2.bindif(bind(fd,(struct sockaddr *)&sin,sizeof(sin))<0){perror("bind");exit(1); }//3.listenif(listen(fd,5)<0){perror("listen");exit(1);}//4.accepint newfd=-1;pthread_t tid;struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);while(1){newfd= accept(fd,(struct sockaddr*)&cin,&addrlen);if(newfd<0){perror("accept");exit(1);}char IPV4_addr[16];if(!inet_ntop(AF_INET,(void *)&cin.sin_addr,IPV4_addr,sizeof(cin))){perror("inet_ntop");exit(1);}printf("cilent:(%s,%d)is connect\n",IPV4_addr,ntohs(cin.sin_port));pthread_create(&tid,NULL,cilent_data_handle,(void *)&newfd);}//readreturn 0;
}
客户端:
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#define QUIT_STR "QUIT"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128"
#define bufsize 1024
int main(int arc,void **arg)
{if(arc!=3){exit(1);}int port =-1;port=atoi(arg[2]);int fd=-1;fd = socket(AF_INET,SOCK_STREAM,0);if(fd == -1){perror("socket");exit(1);}struct sockaddr_in sin;bzero(&sin,sizeof(sin));sin.sin_family = AF_INET;sin.sin_port=htons(port);sin.sin_addr.s_addr=inet_addr(arg[1]);if(connect(fd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect");exit(1);}char buf[bufsize];while(1){bzero(buf,strlen(buf));if(fgets(buf,bufsize-1,stdin)==NULL){continue;}write(fd,buf,strlen(buf));if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){break;}}
close(fd);return 0;
}
代码示例:



2、TCP多进程并发服务器
服务端
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <pthread.h>
#include <strings.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#define QUIT_STR "QUIT"
#define SERV_RESP_STR "SERVER:"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128"
#define bufsize 1024
void child_data_handle(int signum)
{if(SIGCHLD==signum){waitpid(-1,NULL,WNOHANG);}
}
void* cilent_data_handle(void* arg)
{int newfd=*(int *)arg;char buf[bufsize];printf("child process handle:newfd = %d\n",newfd);int ret =-1;while(1){do{bzero(buf,bufsize);ret=read(newfd,buf,bufsize-1);}while(ret<1);if(ret<0){exit(1);}if(!ret){break;}printf("recive data is %s\n",buf);if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){printf("cilenr is exiting!\n");break;}}close(newfd);}
int main()
{int fd=-1;signal(SIGCHLD,child_data_handle);fd=socket(AF_INET,SOCK_STREAM,0);if(fd == -1){perror("socket");exit(1);}struct sockaddr_in sin;bzero(&sin,sizeof(sin));sin.sin_family=AF_INET;sin.sin_port = htons(SERV_IP);sin.sin_addr.s_addr = INADDR_ANY;
/* if(inet_pton(AF_INET,SERV_IP_ADDR,(void*)&sin.sin_addr.s_addr)!=1){perror("inet_pton");exit(1);}*///2.bindif(bind(fd,(struct sockaddr *)&sin,sizeof(sin))<0){perror("bind");exit(1); }//3.listenif(listen(fd,5)<0){perror("listen");exit(1);}//4.accepint newfd=-1;pthread_t tid;pid_t pid;struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);while(1){newfd= accept(fd,(struct sockaddr*)&cin,&addrlen);if(newfd<0){perror("accept");exit(1);}pid = fork();if(pid<0){perror("fork");break;}if(pid == 0){char IPV4_addr[16];if(!inet_ntop(AF_INET,(void *)&cin.sin_addr,IPV4_addr,sizeof(cin))){perror("inet_ntop");exit(1);}printf("cilent:(%s,%d)is connect\n",IPV4_addr,ntohs(cin.sin_port));cilent_data_handle(&newfd);close(fd);}if(pid >0){close(newfd);}}//readreturn 0;
}
客户端:
#include<stdio.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <strings.h>
#define QUIT_STR "QUIT"
#define SERV_IP 5001
#define SERV_IP_ADDR "192.168.238.128"
#define bufsize 1024
int main(int arc,void **arg)
{if(arc!=3){exit(1);}int port =-1;port=atoi(arg[2]);int fd=-1;fd = socket(AF_INET,SOCK_STREAM,0);if(fd == -1){perror("socket");exit(1);}struct sockaddr_in sin;bzero(&sin,sizeof(sin));sin.sin_family = AF_INET;sin.sin_port=htons(port);sin.sin_addr.s_addr=inet_addr(arg[1]);if(connect(fd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect");exit(1);}char buf[bufsize];while(1){bzero(buf,strlen(buf));if(fgets(buf,bufsize-1,stdin)==NULL){continue;}write(fd,buf,strlen(buf));if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){break;}}
close(fd);return 0;
}
运行结果:



相关文章:
十八、TCP多线程、多进程并发服务器
1、TCP多线程并发服务器 服务端: #include<stdio.h> #include <arpa/inet.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <pthread.h>…...
JAVA中正则表达式的入门与使用
JAVA中正则表达式的入门与使用 一,基础概念 正则表达式(Regex) 用于匹配字符串中的特定模式,Java 中通过 java.util.regex 包实现,核心类为: Pattern:编译后的正则表达式对象。 Matcher&#…...
AIGC-文生图与图生图
在之前的文章中,我们知道了如何通过Web UI和Confy UI两种SD工具来进行图片生成,今天进一步地讲解其中的参数用处及如何调节。 文生图 参数详解 所谓文生图,就是通过文字描述我们想要图片包含的内容。初学的话,还是以Web UI为例…...
量化交易 - 聚宽joinquant - 多因子入门研究 - 源码开源
先看一下我们的收益: JoinQuant直达这里看看 下面讲解原理和代码。 目录 一、是否为st 二、是否停牌 三、市值小、roe大 四、编写回测代码 今天来研究一下多因子回测模型,这里以‘市值’、‘roe’作为例子。 几个标准:沪深300里选股&am…...
本地缓存方案Guava Cache
Guava Cache 是 Google 的 Guava 库提供的一个高效内存缓存解决方案,适用于需要快速访问且不频繁变更的数据。 // 普通缓存 Cache<Key, Value> cache CacheBuilder.newBuilder().maximumSize(1000) // 最大条目数.expireAfterWrite(10, TimeUnit.MINUTES) /…...
虚拟列表react-virtualized使用(npm install react-virtualized)
1. 虚拟化列表 (List) // 1. 虚拟化列表 (List)import { List } from react-virtualized; import react-virtualized/styles.css; // 只导入一次样式// 示例数据 const list Array(1000).fill().map((_, index) > ({id: index,name: Item ${index},description: This is i…...
解释型语言和编译型语言的区别
Python 的执行过程通常涉及字节码,而不是直接将代码编译为机器码。以下是详细的解释: ### **Python 的执行过程** 1. **源代码到字节码**: - Python 源代码(.py 文件)首先被编译为字节码(.pyc 文件&…...
猫咪如厕检测与分类识别系统系列【三】融合yolov11目标检测
✅ 前情提要 家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠…...
sql server 字段逗号分割取后面的值
在 SQL Server 中,如果你有一个字段(字段类型通常是字符串),其中包含用逗号分隔的值,并且你想提取这些值中逗号后面的特定部分,你可以使用多种方法来实现这一点。这里我将介绍几种常见的方法: …...
FPGA 37 ,FPGA千兆以太网设计实战:RGMII接口时序实现全解析( RGMII接口时序设计,RGMII~GMII,GMII~RGMII 接口转换 )
目录 前言 一、设计流程 1.1 需求理解 1.2 模块划分 1.3 测试验证 二、模块分工 2.1 RGMII→GMII(接收方向,rgmii_rx 模块) 2.2 GMII→RGMII(发送方向,rgmii_tx 模块) 三、代码实现 3.1 顶层模块 …...
上篇:《排序算法的奇妙世界:如何让数据井然有序?》
个人主页:strive-debug 排序算法精讲:从理论到实践 一、排序概念及应用 1.1 基本概念 **排序**:将一组记录按照特定关键字(如数值大小)进行递增或递减排列的操作。 1.2 常见排序算法分类 - **简单低效型**ÿ…...
红宝书第三十四讲:零基础学会单元测试框架:Jest、Mocha、QUnit
红宝书第三十四讲:零基础学会单元测试框架:Jest、Mocha、QUnit 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、单元测试是什么? 就像给代码做“体检”,帮你检查…...
【JDBC-54.1】MySQL JDBC连接字符串常用参数详解
在Java应用程序中连接MySQL数据库时,JDBC连接字符串是建立连接的关键。一个配置得当的连接字符串不仅能确保连接成功,还能优化性能、增强安全性并处理各种连接场景。本文将深入探讨MySQL JDBC连接字符串的常用参数及其最佳实践。 1. 基本连接字符串格式…...
swagger 注释说明
一、接口注释核心字段 在 Go 的路由处理函数(Handler)上方添加注释,支持以下常用注解: 注解名称用途说明示例格式Summary接口简要描述Summary 创建用户Description接口详细说明Description 通过用户名和邮箱创建新用户Tags接口分…...
CST1019.基于Spring Boot+Vue智能洗车管理系统
计算机/JAVA毕业设计 【CST1019.基于Spring BootVue智能洗车管理系统】 【项目介绍】 智能洗车管理系统,基于 Spring Boot Vue 实现,功能丰富、界面精美 【业务模块】 系统共有三类用户,分别是:管理员用户、普通用户、工人用户&…...
【前端网络请求】XHR封装,支持文件上传、进度监控、混合字段传输
网络请求介绍 XMLHttpRequest(XHR)是前端开发中用于发起网络请求的基础技术。虽然现代开发中常用fetch或axios,但掌握XHR的封装技巧仍能让你更灵活地应对复杂需求。本文将通过一个可复用、功能全面的XHR封装工具,教你实现以下功能: 📤 文件上传(单个/多个文件)📊 实…...
# Shell脚本参数设计规范(DeepSeek指导)
Shell脚本参数设计规范(DeepSeek指导) 文章目录 Shell脚本参数设计规范(DeepSeek指导)A 我问:Q DeepSeek回答:**命令行参数表示规范****标准化表示示例**情况1:必选选项参数值情况2:…...
学习SqlSugar的跨库查询基本用法
使用SqlSugar操作数据库通常都是单库操作,跨库查询的情况要么是单个系统数据不完整,需要其它系统的关联业务数据支撑,要么就是需要整合汇总多个系统的数据进行数据数据分析、处理、展示。遇到上述情况,可以要求另外的系统提供查询…...
HTTP:五.WEB服务器
web服务器 定义:实现提供资源或应答的提供者都可以谓之为服务器!web服务器工作内容 接受建立连接请求 接受请求 处理请求 访问报文中指定的资源 构建响应 发送响应 记录事务处理过程 Web应用开发用到的一般技术元素 静态元素:html, img,js,Css,SWF,MP4 动态元素:PHP,…...
5.3 GitHub订阅系统核心架构解密:高并发设计与SQLite优化实战
GitHub Sentinel 分析报告功能实现:订阅管理核心逻辑解析 关键词:GitHub API 订阅管理, SQLite 数据库设计, RESTful API 开发, 原子操作封装, 异常处理机制 1. 订阅管理功能架构设计 订阅管理模块采用分层架构设计,通过清晰的接口隔离实现高内聚低耦合: #mermaid-svg-bW…...
CSI-PVController-volumeWorker
volumeWorker() 与claim worker流程一样,从volumeQueue中取数据,也就是取出的都是PV,如果informer中有这个pv,就进入update流程。 定义workFunc:首先,定义了一个匿名函数workFunc,这个函数是实…...
0基础 | 硬件滤波 C、RC、LC、π型
一、滤波概念 (一)滤波定义 滤波是将信号中特定波段频率滤除的操作,是抑制和防止干扰的重要措施。通过滤波器实现对特定频率成分的筛选,确保目标信号的纯净度,提升系统稳定性。 (二)滤波器分…...
图论基础理论
在我看来,想要掌握图的基础应用,仅需要三步走。 什么是图(基本概念)、图的构造(打地基)、图的遍历方式(应用的基础) 只要能OK的掌握这三步、就算图论入门了!࿰…...
leaflet 之 获取中国某个行政区的经纬度边界(latLngBounds)
思路 在json文件中获取下面的四个点 组成东北,西南两组 { “southwest”: { “lat”: 35.950, “lng”: 120.000 },//西南方 “northeast”: { “lat”: 36.200, “lng”: 120.300 }//东北方 } 最西点经度(minLng) 最东点经度(maxLng&#x…...
企业级低代码平台的架构范式转型研究
在快速迭代的数字时代,低代码平台如同一股清流,悄然成为开发者们的新宠。 它利用直观易用的拖拽式界面和丰富的预制组件,将应用程序的开发过程简化到了前所未有的程度。通过封装复杂的编程逻辑和提供强大的集成能力,低代码平台让…...
怎么免费下载GLTF/GLB格式模型文件,还可以在线编辑修改
现在非常流行glb格式模型,和gltf格式文件,可是之类模型网站非常非常少 1,咱们先直接打开http://glbxz.com 官方glb下载网站 glbxz.com 2 可以搜索,自己想要的模型关键词 3,到自己想下载素材页面 4,…...
MyBatis 中 Mapper 传递参数的多种方法
# MyBatis Mapper 传递参数的多种方法及其优势 在使用 MyBatis 进行数据库操作时,Mapper 接口的参数传递是一个非常基础但又十分重要的部分。不同的参数传递方式适用于不同的场景,合理选择可以大大提高代码的可读性和维护性。本文将详细介绍几种常见的 …...
大模型到底是怎么产生的?一文揭秘大模型诞生全过程
前言 大模型到底是怎么产生的呢? 本文将从最基础的概念开始,逐步深入,用通俗易懂的语言为大家揭开大模型的神秘面纱。 大家好,我是大 F,深耕AI算法十余年,互联网大厂核心技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 【专栏介绍】: 欢迎关注《…...
2025年3月 Scratch图形化三级 真题解析 中国电子学会全国青少年软件编程等级考试
2025年3月Scratch图形化编程等级考试三级真题试卷 一、选择题 第 1 题 默认小猫角色,scratch运行程序后,下列说法正确的是?( ) A.小猫的颜色、位置在一直变化 B.小猫在舞台中的位置在一直变化,颜色…...
判断两个 IP 地址是否在同一子网 C
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> // 将点分十进制的 IP 地址转换为 32 位无符号整数 unsigned int ip_to_uint(const char *ip) { struct in_addr addr; if (inet_pton(AF_INET, ip, &am…...
