多进程/线程并发服务器

多进程:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>#define SER_PORT 8888
#define SER_IP  "192.168.124.242"   //"0.0.0.0"int deal_cli_msg( int newfd, struct sockaddr_in cin);int main(int argc, const char *argv[])
{//创建流式套接字int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("socket");return -1;}printf("socket success __%d__\n", __LINE__);//允许端口快速重用                                                                                  int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("setsockopt");return -1;}printf("reuseaddr success __%d__\n", __LINE__);//若从命令行传入端口号,则使用传入的端口号,没有传入则使用宏定义的端口号int port =  argc>=2?atoi(argv[1]):SER_PORT;//填充服务器的地址信息结构体,给bind函数使用//真实的地址信息结构体根据地址族指定 AF_INET: man 7 ipstruct sockaddr_in sin;sin.sin_family      = AF_INET;              //必须填AF_INETsin.sin_port        = htons(port);          //端口号的网络字节序,1024~49151sin.sin_addr.s_addr = inet_addr(SER_IP);    //本机IP的网络字节序,ifconfig查看本机IP//127.0.0.1:本地换回IP,只能做本机通信的IP//0.0.0.0 : 代表运行环境中所有可用IP//绑定服务器自身的地址信息if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("bind");return -1;}printf("bind success __%d__\n", __LINE__);//将套接字设置为被动监听状态if(listen(sfd, 128) < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("listen");return -1;}printf("listen success __%d__\n", __LINE__);//阻塞等待客户端连接成功,从已完成连接的队列头中获取一个客户端信息,//生成一个新的文件描述符,这个新的文件描述符才是与客户端通信用的文件描述符struct sockaddr_in cin;     //存储获取到的客户端的地址信息socklen_t addrlen = sizeof(cin);int newfd = -1;pid_t pid = 0;while(1){//父进程负责处理客户端连接事件newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);if(newfd < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("accpet");return -1;}printf("client connect success, [%s:%d] newfd = %d __%d__\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, __LINE__);//有客户端连接成功,需要创建子进程负责与客户端通信pid = fork();if( 0 == pid){close(sfd);//子进程中的sfddeal_cli_msg(newfd, cin);break;        //or exit(0);子进程只负责与客户端交互,客户端退出,子进程需要结束}close(newfd);//父进程的newfd;}close(sfd);//父进程中的sfdreturn 0;
}int deal_cli_msg( int newfd, struct sockaddr_in cin)
{char buf[128] = "";ssize_t res = 0;while(1){bzero(buf, sizeof(buf));    //memset(buf, 0, sizeof(buf));//收res = recv(newfd, buf, sizeof(buf), 0);if(res < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("recv");return -1;}else if(0 == res){printf("client [%s:%d] offline  __%d__\n",\inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), __LINE__);break;}printf("[%s:%d] newfd=%d : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, buf);//发strcat(buf, "*_*");if(send(newfd, buf, sizeof(buf), 0) < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("send");return -1;}printf("send success __%d__\n", __LINE__);}close(newfd);//子进程中的newfdreturn 0;
}

多线程:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>#define SER_PORT 8888
#define SER_IP  "192.168.124.242"   //"0.0.0.0"int deal_cli_msg( int newfd, struct sockaddr_in cin);int main(int argc, const char *argv[])
{//创建流式套接字int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("socket");return -1;}printf("socket success __%d__\n", __LINE__);//允许端口快速重用                                                                                  int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("setsockopt");return -1;}printf("reuseaddr success __%d__\n", __LINE__);//若从命令行传入端口号,则使用传入的端口号,没有传入则使用宏定义的端口号int port =  argc>=2?atoi(argv[1]):SER_PORT;//填充服务器的地址信息结构体,给bind函数使用//真实的地址信息结构体根据地址族指定 AF_INET: man 7 ipstruct sockaddr_in sin;sin.sin_family      = AF_INET;              //必须填AF_INETsin.sin_port        = htons(port);          //端口号的网络字节序,1024~49151sin.sin_addr.s_addr = inet_addr(SER_IP);    //本机IP的网络字节序,ifconfig查看本机IP//127.0.0.1:本地换回IP,只能做本机通信的IP//0.0.0.0 : 代表运行环境中所有可用IP//绑定服务器自身的地址信息if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("bind");return -1;}printf("bind success __%d__\n", __LINE__);//将套接字设置为被动监听状态if(listen(sfd, 128) < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("listen");return -1;}printf("listen success __%d__\n", __LINE__);//阻塞等待客户端连接成功,从已完成连接的队列头中获取一个客户端信息,//生成一个新的文件描述符,这个新的文件描述符才是与客户端通信用的文件描述符struct sockaddr_in cin;     //存储获取到的客户端的地址信息socklen_t addrlen = sizeof(cin);int newfd;pthread_t tid;struct Climsg pcli;while(1){//主线程负责处理客户端连接事件newfd = accept(sfd, (struct sockaddr*)&cin, &addrlen);if(newfd < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("accpet");return -1;}printf("client connect success, [%s:%d] newfd = %d __%d__\n", \inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, __LINE__);//有客户端连接成功,需要创建一个子线程负责与客户端通信pthread_create( &tid, NULL, deal_cli_msg, (void*)&pcli);pthread_detach( tid);}close(sfd);//父进程中的sfdreturn 0;
}//线程回调函数
void* deal_cli_msg( void* arg )
{int newfd = ( (struct Climsg*)arg )->newfd;struct sockaddr_in cin = ( (struct Climsg*)arg)->cin;char buf[128] = "";ssize_t res = 0;while(1){bzero(buf, sizeof(buf));    //memset(buf, 0, sizeof(buf));//收res = recv(newfd, buf, sizeof(buf), 0);if(res < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("recv");return -1;}else if(0 == res){printf("client [%s:%d] offline  __%d__\n",\inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), __LINE__);break;}printf("[%s:%d] newfd=%d : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), newfd, buf);//发strcat(buf, "*_*");if(send(newfd, buf, sizeof(buf), 0) < 0){fprintf(stderr, "__%d__ ", __LINE__);perror("send");return -1;}printf("send success __%d__\n", __LINE__);}close(newfd);//子线程中的newfdpthread_exit( NULL);
}

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

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

相关文章

在Element Ui中支持从系统粘贴版中获取图片和PDF,Docx,Doc,PPT等文档

在上一篇中&#xff0c;我们单纯的实现了Ctrl V实现从粘贴版中获取图片信息&#xff0c;但是点击上传的时候会有个bug&#xff0c;就是点击文件上传的时候&#xff0c;会出现一个bug&#xff0c;这篇&#xff0c;我们将在上一篇的基础上进行完善&#xff0c;并支持从粘贴版中获…

《数据可视化技术》上机报告

一、实验目的及要求 掌握pyecharts数据可视化环境搭建以及pyecharts交互式基础图形的绘制。 &#xff08;1&#xff09;掌握pyecharts中初始配置项&#xff0c;系列配置项&#xff0c;全局配置项的配置方法。 &#xff08;2&#xff09;掌握pyecharts中条形图的绘制方法。 …

️虚拟机配置NAT和Bridge模式

虚拟机的网络配置 桥接 通过使用物理机网卡 具有单独ip NAT 把物理机为路由器进行上网 NAT模式&#xff1a; 所谓nat模式&#xff0c;就是虚拟系统会通过宿主机的网络来访问外网&#xff0c;而这里的宿主机相当于有两个网卡&#xff0c;一个是真实网卡&#xff0c;一个是虚拟…

2023年值得关注的9大零售趋势

图片来源&#xff1a;Photo by Heidi Fin on Unsplash 随着经济衰退的威胁日益迫近&#xff0c;新的一年带给零售商一系列挑战&#xff0c;而后者刚从一年的供应链瓶颈和库存过剩中恢复过来。当然&#xff0c;2023年并非一直悲观。随着越来越多的零售商找到新的机会&#xff0c…

杰控通过 OPCproxy 获取数据发送到服务器

把数据从 杰控 取出来发到服务器 前提你在杰控中已经有变量了&#xff08;wincc 也适用&#xff09; 打开你的opcproxy 软件包 opcvarFile 添加变量 写文件就写到 了 opcproxy.ini中 这个文件里就是会读取到的数据 然后 opcproxy.exe发送到桌面快捷方式再考回来 &#…

【golang-技巧】-自定义k8s-operator-by kubebuilder

0.背景&参考 link : https://github.com/guangtouwangba/blog-example/tree/master/k8s-operator https://juejin.cn/post/7192525316890296380 https://book.kubebuilder.io/quick-start 1.download sudo curl -L -o kubebuilder https://go.kubebuilder.io/dl/latest/…

关于深度学习的一些工具安装与细节

核心的步骤按这篇文章&#xff1a; Python深度学习环境配置&#xff08;Pytorch、CUDA、cuDNN&#xff09;&#xff0c;包括Anaconda搭配Pycharm的环境搭建以及基础使用教程&#xff08;保姆级教程&#xff0c;适合小白、深度学习零基础入门&#xff09;_python torch cuda-CS…

DVWA靶场通关——SQL Injection篇

一&#xff0c;Low难度下unionget字符串select注入 1&#xff0c;首先手工注入判断是否存在SQL注入漏洞&#xff0c;输入1 这是正常回显的结果&#xff0c;再键入1 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for…

Unity安装后点击登录没反应

我是把默认浏览器改为google就行了 1.点击登录无反应&#xff0c;无登录界面 用谷歌浏览器打开&#xff01;&#xff01;&#xff01;&#xff01; 把默认浏览器换成谷歌&#xff01; 火狐、百度等内置百度搜索引擎的都没反应&#xff01; 坑的我重装了好几遍UnityHub呜呜呜…

协方差矩阵及其计算方法

协方差矩阵&#xff08;Covariance Matrix&#xff09;是一个描述多维数据特征之间相互关系的矩阵&#xff0c;广泛应用于统计学和机器学习中。它用于表示各个特征之间的协方差&#xff0c;是分析多维数据分布和特征依赖性的重要工具。 什么是协方差矩阵&#xff1f; 协方差矩…

[241115] Debian 12.8 发布 | Mistral AI 推出批量 API,成本降低 50%

目录 Debian 12.8 发布Mistral AI 推出批量 API&#xff0c;成本降低 50% Debian 12.8 发布 Debian 项目正式发布了第八个稳定版更新 Debian 12.8 (代号 bookworm)。此次更新主要修复了安全漏洞&#xff0c;并调整了一些严重问题。安全公告已单独发布&#xff0c;并在更新说明…

鸿蒙学习生态应用开发能力全景图-三方库(3)

鸿蒙生态三方库&#xff0c;是在鸿蒙系统上可重复使用的软件库&#xff0c;可帮助开发者重用技术资产&#xff0c;快速开发鸿蒙生态应用、元服务&#xff0c;提升开发效率。根据不同的开发语言分为两种&#xff1a;  ArkTS/TS/JS 语言的三方库&#xff0c;可直接导入并使用。…

OpenAI官方发布:利用ChatGPT提升写作的12条指南

近日&#xff0c;OpenAI官方发布了学生如何利用ChatGPT提升写作的12条指南&#xff0c;值得深入研究学习。 在如今AIGC应用爆发增长的时间点&#xff0c;如何充分利用生成式AI工具&#xff0c;如ChatGPT&#xff0c;有效切快速的提升写作和学习能力&#xff0c;成为每个学生、…

【数据库系列】Spring Data Neo4j Cypher 查询使用进阶指南

在 Neo4j 中&#xff0c;Cypher 查询语句并不像 MySQL 的 mapper XML 那样直接支持拆分和组织。然而&#xff0c;你可以使用一些策略来管理和重用 Cypher 查询&#xff0c;使其更易于维护和组织。以下是几种方法&#xff1a; 1. 使用 Spring Data Neo4j 的 Repository 接口 通…

React中常用的hook函数(四)——useRef、useNavigate、useLocation和useSearchParams

一、useRef 1. 基础概念&#xff1a; useRef 返回一个可变的 ref 对象&#xff0c;这个对象的 .current 属性可以用来存储一个值&#xff0c;该值在组件的生命周期内是持久化的&#xff0c;并且它不会导致组件重新渲染。 语法&#xff1a; const myRef useRef(initialValue)…

.net core开发windows程序在国产麒麟操作系统中运行

.net core自从3.1版本号后&#xff0c;完全是一个独立的开源的多平台开发组件&#xff0c;目前国产化是趋势&#xff0c;不少项目需要开发国产如Kylin操作系统中运行的程序&#xff0c;无论是Web程序还是桌面程序&#xff0c;都有这样的需求。 首先&#xff0c;可明确的的.net…

基于 Python 的 Bilibili 评论分析与可视化

一、项目概述 本项目利用 Python 对 Bilibili &#xff08;哔哩哔哩&#xff09;平台上的视频评论数据进行爬取、清洗和分析&#xff0c;并通过可视化展示数据的主要特征。我们通过以下几个步骤实现了这一过程&#xff1a; 数据爬取&#xff1a;使用 Bilibili 提供的 API 获取…

Jenkins的pipeline Script的 每个组件的详细讲解

在Jenkins的Pipeline脚本中&#xff0c;各个组件的配置和Groovy的一些常用函数起到了决定性的作用&#xff0c;帮助开发人员控制自动化流程的执行。以下是对Jenkins Pipeline的主要组件和Groovy常用函数的详细讲解&#xff1a; 1. Jenkins Pipeline主要组件 1.1 agent 功能&…

基于碎纸片的拼接复原算法及MATLAB实现

一、问题描述 破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。传统上&#xff0c;拼接复原工作需由人工完成&#xff0c;准确率较高&#xff0c;但效率很低。特别是当碎片数量巨大&#xff0c;人工拼接很难在短时间内完成任务。随着计算…

如何禁用VMware虚拟网卡

安装VMWare虚拟机之后&#xff0c;会在本地创建两个虚拟网卡VMware Network Adapter VMnet1和VMware Network Adapter VMnet8&#xff0c;如果使用iNode客户端联网时会进行禁用多网卡检测&#xff0c;否则无法联网。因此&#xff0c;问题根源就在于虚拟网卡未禁用。 1、网络和…