Linux 基本语句_15_Tcp并发服务器

原理:

利用父子进程。父进程接收客户端的连接请求,子进程处理客户端的数据处理操作,两者各施其职。最终实现能够多个客户端连接一个服务端的操作。

代码:

服务端代码:

#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>#define N 128void handler(int sig){wait(NULL); // 不关心子进程状态,等待子进程终止,回收其资源 
}int main(int argc, const char *argv[]){int sockfd, acceptfd;struct sockaddr_in severaddr, clientaddr; // 存储客户端和服务器的地址信息 socklen_t addrlen = sizeof(severaddr);char buf[N] = "";pid_t pid;bzero(&severaddr, addrlen);  bzero(&clientaddr, addrlen); // 清除特定长度的区域 if(argc < 3){printf("argc number error\n");return -1;}if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ // IPv4协议、流式套接字 (创建套接字) printf("socket create error\n");return -1;}/* 填充信息 */severaddr.sin_family = AF_INET;severaddr.sin_addr.s_addr = inet_addr(argv[1]);severaddr.sin_port = htons(atoi(argv[2]));/* 将套接字与服务器网络信息结构体绑定 */if(bind(sockfd, (struct sockaddr *) &severaddr, addrlen) < 0){printf("bind error\n");return -1;}if(listen(sockfd, 5) < 0){ // 设置被动监听模式 printf("listen error\n");return -1; }signal(SIGUSR1, handler); // 注册一个信号 while(1){ // 等待客户端连接请求 if((acceptfd = accept(sockfd, (struct sockaddr *) &clientaddr, &addrlen)) < 0){ // 阻塞等待 printf("accept error\n");}printf("ip : %s, port : %d\n", inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));pid = fork(); // 创建子进程 if(pid < 0){printf("fork error\n");return -1;}else if(pid == 0){ // 子进程 close(sockfd); // 只需要处理信息,不负责客户端连接while(1){ssize_t bytes;if((bytes = recv(acceptfd, buf, N, 0)) < 0){printf("recv error\n");return -1;}else if(bytes == 0){printf("no data\n");}else{if(strncmp(buf, "quit", 4) == 0){printf("client quit\n");sleep(1);break;}else{printf("client: %s\n", buf);strcat(buf, "-server");if(send(acceptfd, buf, N, 0) < 0){printf("send error\n");return -1;}}}}kill(getppid(), SIGUSR1);exit(0); }else{close(acceptfd); // 释放资源,关闭与客户端连接 } }return 0; 
}

客户端代码:

#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>#define N 128void handler(int sig){wait(NULL); // 不关心子进程状态,等待子进程终止,回收其资源 
}int main(int argc, const char *argv[]){int sockfd, acceptfd;struct sockaddr_in serveraddr, clientaddr; // 存储客户端和服务器的地址信息 socklen_t addrlen = sizeof(serveraddr);char buf[N] = "";pid_t pid;bzero(&serveraddr, addrlen);  bzero(&clientaddr, addrlen); // 清除特定长度的区域 if(argc < 3){printf("argc number error\n");return -1;}if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ // IPv4协议、流式套接字 (创建套接字) printf("socket create error\n");return -1;}/* 填充信息 */serveraddr.sin_family = AF_INET;serveraddr.sin_addr.s_addr = inet_addr(argv[1]);serveraddr.sin_port = htons(atoi(argv[2]));/* 将套接字与服务器网络信息结构体绑定 *//*	if(bind(sockfd, (struct sockaddr *) &severaddr, addrlen) < 0){printf("bind error\n");return -1;}if(listen(sockfd, 5) < 0){ // 设置被动监听模式 printf("listen error\n");return -1; }signal(SIGUSR1, handler); // 注册一个信号 
*/if(connect(sockfd, (struct sockaddr *) &serveraddr, addrlen) < 0){ // 发送客户端连接请求 printf("connect error\n");return -1;}while(1){ // 等待客户端连接请求 fgets(buf, N, stdin);buf[strlen(buf) - 1] = '\0';if(send(sockfd, buf, N, 0) < 0){printf("send error\n");return -1;}else{if(strncmp(buf, "quit", 4) == 0){break;}}if(recv(sockfd, buf, N, 0) < 0){printf("recv error\n");return -1;}printf("server: %s\n", buf); }return 0; 
}

效果:

在这里插入图片描述

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

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

相关文章

借着期末作业,写一个JavaWeb项目

合集传送门 要求 学生成绩管理系统设计与实现 设计一个学生成绩管理系统。根据以下功能&#xff0c;分析使用的逻辑结构和存储结构。并设计菜单&#xff0c;显示相应结果。 &#xff08;1&#xff09;录入功能&#xff1a;能够录入学生成绩&#xff08;包括&#xff1a;学号…

一个遗憾,特此纪念

这是学习笔记的第 2479篇文章 说一件有些遗憾的事情。其实今年遗憾的事情有好几件&#xff0c;这一件算是其中之一。倒不是它发生在今天&#xff0c;而是每每想起来&#xff0c;都有一种无力感和酸楚&#xff0c;索性简单写一写纪念一下。 这件事情就是放弃了读博士的想法。 在…

权重衰减(Weight Decay)

在深度学习中&#xff0c;权重衰减&#xff08;Weight Decay&#xff09;是一种常用的正则化技术&#xff0c;旨在减少模型的过拟合现象。权重衰减通过向损失函数添加一个正则化项&#xff0c;以惩罚模型中较大的权重值。 一、权重衰减 在深度学习中&#xff0c;模型的训练过程…

SQL基础:操作环境搭建

在上一节中&#xff0c;我们简单讲述了数据库和SQL的基本概念。 本节我们讲述一下环境搭建&#xff0c;为下一节讲表的基本操作做下铺垫。 环境搭建 具体到操作&#xff0c;我们就要准备一些环境了。如果不进行练习&#xff0c;我们学习的知识将很快被遗忘。 MySQL安装&…

【MySQL内置函数】

目录&#xff1a; 前言一、日期函数获取日期获取时间获取时间戳在日期上增加时间在日期上减去时间计算两个日期相差多少天当前时间案例&#xff1a;留言板 二、字符串函数查看字符串字符集字符串连接查找字符串大小写转换子串提取字符串长度字符串替换字符串比较消除左右空格案…

【话题】低代码123

目录 一、什么是低代码 二、低代码的优缺点 三、你认为低代码会替代传统编程吗&#xff1f; 四、有哪些低代码工具和框架 4.1 国外的平台 4.2 国内的平台 五、未来的软件研发 低代码&#xff0c;听着就过瘾的一个词。而且不是无代码&#xff0c;这说明&#xff0c;低代码…

计算机组成原理-函数调用的汇编表示(call和ret指令 访问栈帧 切换栈帧 传递参数和返回值)

文章目录 call指令和ret指令高级语言的函数调用x86汇编语言的函数调用call ret指令小结其他问题 如何访问栈帧函数调用栈在内存中的位置标记栈帧范围&#xff1a;EBP ESP寄存器访问栈帧数据&#xff1a;push pop指令访问栈帧数据&#xff1a;mov指令小结 如何切换栈帧函数返回时…

Spring入门

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Toyota Programming Contest 2023#8(AtCoder Beginner Contest 333)

A - Three Threes 题目大意&#xff1a;给你一个整数n&#xff0c;将这个数n输出n次。 呃呃 B - Pentagon 题目大意&#xff1a;给你一个正五边形ABCDE&#xff0c;给你任意两条边&#xff0c;判断是否相等 主要问题要判断一下内边&#xff1a;AD&#xff0c;AC&#xff0c;…

基于ssm图书商城网站的设计和开发论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本图书商城网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

Win11极速安装Tensorflow-gpu+CUDA+cudnn

文章目录 0.pip/conda换默认源1.Anacondapython虚拟环境2.安装CUDA以及cudnn 0.pip/conda换默认源 为了高效下载&#xff0c;建议先把默认源换了&#xff0c;很简单这里不再赘述。&#xff08;我用梯子&#xff0c;所以没换源&#x1f60b;&#xff09; 1.Anacondapython虚拟…

最棒的 7 款精选我的世界光影水反效果包

光影支持基础Mod下载 版本&#xff1a;1.12✔1.11.2✔1.10.2✔1.9.4✔1.8✔1.7.10✔ 下载和安装&#xff1a; GLSL Shaders Mod 或者 OptiFine 我的世界光影支持Mod可以帮助玩家提示游戏画面&#xff0c;加强你的游戏录制视频效果和实时游戏体验。有数量众多的光影效果包提供…

一文了解Tomcat

文章目录 1、Tomcat介绍2、Tomcat使用配置2.1、Tomcat下载启动2.2、Tomcat启动乱码2.3、Tomcat端口号修改 3、Tomcat项目部署4、IDEA中使用Tomcat方式 1、Tomcat介绍 什么是Tomcat ​ Tomcat是Apache软件基金会一个核心项目&#xff0c;是一个开源免费的轻量级web服务器&#x…

《Linux C编程实战》笔记:一些系统调用

目录 dup和dup2函数 fcntl函数 示例程序1 示例程序2 ioctl函数 dup和dup2函数 #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd): dup 函数复制 oldfd 参数所指向的文件描述符。 参数&#xff1a; oldfd&#xff1a;要复制的文件描述符的…

[笔记] wsl 下使用 qemu/grub 模拟系统启动(单分区)

背景 最近在学习操作系统&#xff0c;需要从零开始搭建系统&#xff0c;由于教程中给的虚拟机搭建的方式感觉还是过于重量级&#xff0c;因此研究了一下通过 qemu 模拟器&#xff0c;配合 grub 完成启动系统的搭建。 qemu 介绍 qemu 是一款十分优秀的系统模拟器&#xff0c;…

@PostMapping接收String类型的参数

接口这样定义&#xff1a; PostMapping("/aaa") public void getById(String param)参数这样测试&#xff1a;

C++特殊类和类型转换剖析

目录 一、特殊类 1.1拒绝被拷贝的类 1.2 限制在堆上创建类 1.3 限制在栈上创建的类 1.4 不能被继承的类 二、类型转换 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 一、特殊类 什么是特殊类&#xff1f;在普通类的设计基础上&#xff0c…

基于Java+vue的音乐网站设计与实现(源码+文档+数据库)

摘 要 在此基础上&#xff0c;提出了一种基于javavue的在线音乐排行榜系统的设计与实现方法。本系统分为两个大的功能&#xff0c;即&#xff1a;前端显示、后端管理。而在前台&#xff0c;则是播放不同的歌曲&#xff0c;让人可以在上面观看不同的歌曲&#xff0c;也可以观看…

CSS学习

CSS学习 1. 什么是css?2.css引入方式2.1 内嵌式2.2 外联式2.3 行内式2.4 引入方式特点 3. 基础选择器3.1 标签选择器3.2 类选择器3.3 id选择器3.4 通配符选择器 4. 文字基本样式4.1 字体样式4.1.1 字体大小4.1.2 字体粗细4.1.3 倾斜4.1.4 字体4.1.5 字体font相关属性连写 4.2 …

地图自定义省市区合并展示数据整合

需求一&#xff1a;将省级地图下的两个市合并成一个区域&#xff0c;中间的分割线隐藏。 1、访问下方地址&#xff0c;搜索并下载省级地图json文件。 地址&#xff1a;https://datav.aliyun.com/portal/school/atlas/area_selector 2、切换到边界生成器&#xff0c;上传刚刚下…