TCP并发服务器的多进程实现与多线程实现

TCP并发服务器的多进程实现与多线程实现

一、 TCP并发服务器的多进程实现

代码

#include <my_head.h>#define SERVER_IP "192.168.125.11" //  服务器IP
#define SERVER_PORT 6666           //  服务器端口// 子进程处理客户端信息函数
int deal_client_message(int new_sfd, struct sockaddr_in client_info);
// 回调函数回收僵尸进程函数
void callBack_zembie(int sig);int main(int argc, const char *argv[])
{// 用信号的方式回收僵尸进程if (signal(SIGCHLD, callBack_zembie) < 0){ERR_MSG("signal");return -1;}// 创建流式套接字int sfd = socket(AF_INET, SOCK_STREAM, 0);if (sfd < 0){ERR_MSG("socket");return -1;}// 待绑定的服务器的信息struct sockaddr_in server_info;server_info.sin_addr.s_addr = inet_addr(SERVER_IP);server_info.sin_port = htons(SERVER_PORT);server_info.sin_family = AF_INET;// 绑定if (bind(sfd, (struct sockaddr *)&server_info, sizeof(server_info)) < 0){ERR_MSG("bind");return -1;}// 监听if (listen(sfd, 128) < 0){ERR_MSG("listen");return -1;}// 客户端连接过来的信息struct sockaddr_in client_info;socklen_t len = sizeof(client_info);// 用于接收客户端连接的文件描述符int new_sfd;// 子进程的 pidpid_t cpid = -1;while (1){// 连接acceptnew_sfd = accept(sfd, (struct sockaddr *)&client_info, &len);if (new_sfd < 0){ERR_MSG("accept");return -1;}printf("[%s : %d]已连接 new_fd = %d \n", inet_ntoa(client_info.sin_addr),ntohs(client_info.sin_port), new_sfd);// 创建子进程,用于处理接收的信息cpid = fork();// 子进程进行处理if (0 == cpid){// 关闭父进程的服务器文件描述符close(sfd);// 调用函数进行处理消息deal_client_message(new_sfd, client_info);// 关闭新创建的用于接收客户端传来信息的文件描述符close(new_sfd);// 结束进程,当前进程为子进程exit(0);}else if (cpid < 0){ERR_MSG("fork");return -1;}// 下边这部分是父进程的内容// 在此次循环中关闭新建的文件描述符,因为下次循环又会创建了close(new_sfd);}// 关闭套接字close(sfd);return 0;
}// 回调函数回收僵尸进程函数功能实现
void callBack_zembie(int sig)
{// 回收僵尸进程资源while (waitpid(-1, NULL, WNOHANG) > 0);
}// 子进程处理客户端信息函数功能实现
int deal_client_message(int new_sfd, struct sockaddr_in client_info)
{char buff[128];ssize_t res = -1;while (1){bzero(buff, sizeof(buff));// 接收消息,以阻塞方式接收res = recv(new_sfd, buff, sizeof(buff), 0);if (res < 0){ERR_MSG("recv");break;}else if (0 == res){// 客户端掉线printf("[%s : %d] 已掉线\n", inet_ntoa(client_info.sin_addr),ntohs(client_info.sin_port));break;}// 将消息输出printf("[%s : %d][message : %s]\n", inet_ntoa(client_info.sin_addr),ntohs(client_info.sin_port), buff);// 判断客户端是否断开链接if (!strcmp(buff, "exit")){printf("[%s : %d] 断开链接\n", inet_ntoa(client_info.sin_addr),ntohs(client_info.sin_port));break;}strcat(buff, "---");// 处理消息(可以是回复)if (send(new_sfd, buff, sizeof(buff), 0) < 0){ERR_MSG("send");break;}}// 关闭文件描述符close(new_sfd);return 0;
}

二、 TCP并发服务器的多线程实现

#include <my_head.h>#define SERVER_IP "192.168.125.11"      //  服务器IP
#define SERVER_PORT 6666                //  服务器端口struct client_information
{int new_sfd;struct sockaddr_in info;
};// 线程处理客户端信息函数
void *thread1(void *arg);int main(int argc, const char *argv[])
{// 创建流式套接字int sfd = socket(AF_INET, SOCK_STREAM, 0);if (sfd < 0){ERR_MSG("sfd");return -1;}// 服务器信息struct sockaddr_in server_info;server_info.sin_addr.s_addr = inet_addr(SERVER_IP);server_info.sin_port = htons(SERVER_PORT);server_info.sin_family = AF_INET;// 绑定if (bind(sfd, (struct sockaddr *)&server_info, sizeof(server_info)) < 0){ERR_MSG("bind");return -1;}// 监听if (listen(sfd, 128) < 0){ERR_MSG("listen");return -1;}// 客户端信息struct client_information client_info;socklen_t len = sizeof(client_info.info);// 子线程号pthread_t tid;while (1){// 连接acceptclient_info.new_sfd = accept(sfd, (struct sockaddr *)&(client_info.info), &len);if (client_info.new_sfd < 0){ERR_MSG("accept");return -1;}printf("[%s : %d]已连接 new_fd = %d \n", inet_ntoa(client_info.info.sin_addr),ntohs(client_info.info.sin_port), client_info.new_sfd);// 创建子线程if (pthread_create(&tid, NULL, thread1, &client_info) < 0){fprintf(stderr, "线程创建出错  __%d__\n", __LINE__);return -1;}// 将线程分离,待线程结束后可以直接被操作系统回收pthread_detach(tid);}// 关闭套接字close(client_info.new_sfd);close(sfd);return 0;
}// 线程处理客户端信息函数功能实现
void *thread1(void *arg)
{struct client_information client_info = *((struct client_information *)arg);ssize_t res = -1;char buff[128];while (1){bzero(buff, sizeof(buff));// 接收客户端传来的信息res = recv(client_info.new_sfd, buff, sizeof(buff), 0);if (res < 0){ERR_MSG("recv");break;}else if (0 == res){// 客户端掉线printf("[%s : %d] 已掉线\n", inet_ntoa(client_info.info.sin_addr),ntohs(client_info.info.sin_port));break;}/** 处理回复 */// 将消息输出printf("[%s : %d][message : %s]\n", inet_ntoa(client_info.info.sin_addr),ntohs(client_info.info.sin_port), buff);// 判断客户端是否退出if (!strcmp(buff, "exit")){printf("[%s : %d] 断开链接\n", inet_ntoa(client_info.info.sin_addr),ntohs(client_info.info.sin_port));break;}strcat(buff, "---");// 处理消息(可以是回复)if (send(client_info.new_sfd, buff, sizeof(buff), 0) < 0){ERR_MSG("send");break;}}// 关闭文件描述符close(client_info.new_sfd);// 退出线程pthread_exit(NULL);
}

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

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

相关文章

物联网安全优秀实践:2023年设备保护指南

物联网的发展可谓是革命性的&#xff0c;数十亿台设备实时互连、通信和共享数据。因此&#xff0c;考虑物联网安全的最佳实践至关重要。 物联网的重要性日益上升 在数字时代&#xff0c;物联网(IoT)已成为一股革命力量&#xff0c;重塑了企业运营和个人生活方式。从调节家庭温…

服务器租用机房机房的类型应该如何选择

服务器租用机房机房的类型应该如何选择 1.单电信机房 单电信服务器机房业务模式比较固定&#xff0c;访问量也不是很大&#xff0c;适合新闻类网站或政务类网站。如果网站的PV流量持续增加&#xff0c;建议后期采用租赁CDN的方式解决非电信用户访问网站速度过慢的问题。 2.双线…

一家美国公司被黑,一个拉美国家政务服务瘫痪

政务系统承包商遭勒索攻击&#xff0c;导致哥伦比亚国家政务服务陷入瘫痪。 据报道&#xff0c;9月19日哥伦比亚的多个重要政府部门正在应对一次勒索软件攻击&#xff0c;官员们被迫大幅变更部门运作方式。 哥伦比亚卫生和社会保护部、司法部门、工商监管部门上周宣布&#x…

堆的OJ题

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ 小林的算法笔记       &#x1f6f0;️社区 :✈️ 进步学堂       &am…

中国数据库走向国际的门槛: 15分钟准则

在十五分钟之内跑通第一条SQL 笔者曾经负责国内某Top云厂商的数据库的海外业务和产品设计。简单的说包括TP&#xff0c;AP&#xff0c;NoSQL和Utility的所有数据库相关产品&#xff0c;负责除中国大陆以外所有的业务和客户。三年时间撞墙的教训实在不少。 在官方宣传上&#…

leetcode2 两数相加

题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 示例 输入&#xff1a;l1 [2,4,3], l2 [5,6,4] 输出…

Scala 高阶:Scala中的模式匹配

一、概述 Scala中的模式匹配&#xff08;case&#xff09;类似于Java中的switch...case&#xff0c;但是Scala的模式匹配功能更为强大。通过模式匹配&#xff0c;可以匹配更复杂的条件和数据结构&#xff0c;包括常量、类型、集合、元组等。而 Java 的 switch 语句只能用于匹配…

算法分析与设计编程题 贪心算法

活动安排问题 题目描述 解题代码 vector<bool> greedySelector(vector<vector<int>>& intervals) {int n intervals.size();// 将活动区间按结束时间的从小到大排序auto cmp [](vector<int>& interval1, vector<int>& interval2…

YOLOv5,YOLOv8添加ASFF(自适应空间特征融合)

ASFF&#xff1a;Adaptively Spatial Feature Fusion (自适应空间特征融合) 论文来源&#xff1a;Learning Spatial Fusion for Single-Shot Object Detection 代码地址&#xff1a;ASFF 1.背景 不同特征尺度之间的不一致性是基于特征金字塔的单阶段检测器的主要缺陷。 本文…

服务器环境的关键组成部分

服务器环境是指服务器硬件和软件组成的整体环境&#xff0c;包括操作系统、网络配置、数据库、Web服务器软件、应用程序等。它提供了服务器运行和支持所需的基本条件和组件。 以下是服务器环境中的一些关键组成部分&#xff1a; 操作系统&#xff1a;服务器环境通常基于某种操…

QT : 完成绘制时钟

1.头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QTimer> #include <QTime> #include <QPaintEvent> #include <QDebug> #include <QBrush>QT_BEGIN_NAMESPACE namespace Ui { class…

【VastbaseG100】 FATAL: The account has been locked.

使用VastbaseG100 数据库&#xff0c;查询数据报错。 org.postgresql.util.PSQLException: FATAL: The account has been locked. 帐户已被锁定。 解锁账户呗 ALTER ROLE doc ACCOUNT UNLOCK;ALTER ROLE 用户名 ACCOUNT UNLOCK; 修改密码 ALTER ROLE doc IDENTIFIED BY ZhangS…

css3动画基础详解(@keyframes和animation)

动画是使元素从一种样式逐渐变化为另外一种效果&#xff0c;CSS3动画的生成&#xff0c;主要依赖keyframes定义动画&#xff0c;animation执行动画。 keyframes 通过 keyframes 规则创建动画。 keyframes keyframes-name {keyframes-selector {css-styles;}}keyframes-name 帧…

SpringBoot工程模板

spring脚手架&#xff1a;https://start.spring.io/ <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocati…

Git小乌龟不弹add push commit的方法

1.关于使用Git小乌龟无法弹出Add菜单的问题 第一次使用小乌龟软件&#xff0c;发现可以正常将程序从Gitee仓库中克隆到本地&#xff0c;但是在将本地的程序上传到Gitee仓库中时&#xff0c;TortoiseGit无法弹出Add那一系列菜单&#xff0c;如下图所示&#xff1a; 2.解决方法 …

开源日报 0821:帮你修复老旧照片

这篇文章总结了几个开源项目的特点和优势。其中包括了 Python 资源列表、金融研究工具、动画精灵程序、游戏和旧照片修复项目等。这些项目提供了丰富的功能和技术支持&#xff0c;用户可以根据自己的需求进行定制和改进。总的来说&#xff0c;这些开源项目为开发者和用户提供了…

信息化发展55

数据备份 1 、数据备份是为了防止由于用户操作失误、系统故障等意外原因导致的数据丢失&#xff0c; 而将整个应用系统的数据或一部分关键数据复制到其他存储介质上的过程。这样做的目的是保证当应用系统的数据不可用时&#xff0c; 可以利用备份的数据进行恢复&#xff0c;尽…

安防视频/视频汇聚平台EasyCVR使用onvif探测添加设备通道详细步骤来啦!

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

[论文笔记]Prompt Tuning

引言 今天带来第三篇大模型微调论文笔记The Power of Scale for Parameter-Efficient Prompt Tuning。 作者提出了prompt tuning(提示微调),一种简单高效地微调方法。可以看成是prefix tuning的简化版。 总体介绍 最近的研究表明,提示设计(prompt design)在通过文本提示调…

hw0921

多线程发送方 #include <myhead.h> int main(int argc, const char *argv[]) {//创建流式套接字int cfdsocket(AF_INET,SOCK_STREAM,0);printf("socket success\n");//填充服务器地址struct sockaddr_in sin;sin.sin_familyAF_INET;sin.sin_porthtons(4444);s…