TCP并发服务器

一.进程实现TCP并发服务器

#include <func.h>
#define PORT 6666           
#define IP "192.168.124.42"void handler(int arm)
{while(waitpid(-1,NULL,WNOHANG) > 0);
}
int main(int argc, const char *argv[])
{//接受17号信号signal(17, handler);int sfd = socket(AF_INET,SOCK_STREAM,0); //创建流式套接字printf("sfd create success\n");//绑定 ip 和端口//填充结构体信息struct sockaddr_in sin;sin.sin_family   =  AF_INET;sin.sin_port     = htons(PORT);sin.sin_addr.s_addr  =  inet_addr(IP);bind(sfd, (struct sockaddr*)&sin, sizeof(sin));                    //设置为监听模式listen(sfd,128);//接受客户端信息结构体struct sockaddr_in cin;socklen_t len = sizeof(cin);while(1){//创建新的套接字//父进程进行接受信息int newfd = accept(sfd, (struct sockaddr*)&cin, &len);printf("newfd= %d 客户端连接成功 __%d__\n", newfd, __LINE__);int cpid = fork(); //创建父子进程if(0 == cpid ) //子进程进行信息传递{close(sfd);char arr[128] = "";int a = 0;while(1){//收bzero(arr, sizeof(arr));a = recv(newfd, arr, sizeof(arr), 0);if(a < 0){ERR_MSG("recv");return -1;}if(a == 0){printf("newfd= %d 客户端退出\n", newfd);}printf("接受成功 客户端信息arr= %s\n", arr);//发strcpy(arr, "~_~");send(newfd, arr,sizeof(arr),0);printf("%s 发送成功\n", arr);}exit(0);}}close(sfd);return 0;
}
现象

二、线程

#include <func.h>                                                                                        
#include <pthread.h>
#define PORT 6666
#define IP "192.168.124.42"struct demo
{int newfd;struct sockaddr_in cin; //接收客户端的地址信息
};int chlid(int newfd,struct sockaddr_in cin);void* callbake(void * arg)
{int newfd = ((struct demo*)arg)->newfd;   //传参数struct sockaddr_in cin = ((struct demo*)arg)->cin;   chlid(newfd,cin);//传到函数内部相当另存一个 newfdclose(newfd);pthread_exit(NULL);
}int main(int argc, const char *argv[])
{//创建流式套接  int sfd = socket(AF_INET, SOCK_STREAM, 0);if(sfd < 0){ERR_MSG("sfd");return -1;}printf("socket create succes sfd=%d __%d__\n", sfd, __LINE__);//定义并填充地址信息结构体,给服务器绑定//真实的地址信息结构体根据地址族指定 AF_INET :man ip(7)struct sockaddr_in sin;sin.sin_family      = AF_INET;sin.sin_port        = htons(PORT);      //端口号的网络字节序 : 1024-49151sin.sin_addr.s_addr = inet_addr(IP);    //本机号的网络字节序列//绑定服务器自身的地址信息----必须绑定if(bind(sfd,(struct sockaddr*) &sin, sizeof(sin)) <0){ERR_MSG("bind");return -1;}//将套接字设置为被动监听状态if(listen(sfd, 128) <0){ERR_MSG("listen");return -1;}printf("listen succress __%d__\n", __LINE__);struct demo info; //定义结构体socklen_t addrlen = sizeof(info.cin);//获取连接成功的客户端信息,生成一个新的套接字while(1){info.newfd = accept(sfd,(struct sockaddr *)&info.cin, &addrlen);if(info.newfd < 0){ERR_MSG("accept");return -1;}printf("newfd= %d 客户端连接成功 __%d__\n",info.newfd,__LINE__);pthread_t tid;pthread_create(&tid, NULL,callbake,(void*)&infoi); // 创建一个线程pthread_detach(tid);}//关闭文件描述符if(close(sfd) < 0){ERR_MSG("close");return -1;}return 0;
}int chlid(int newfd,struct sockaddr_in cin)
{ssize_t a = 0;ssize_t b = 0;char arr[128] = "";char crr[128] = "";while(1){//接收客户端数据bzero(arr, sizeof(arr));a = recv(newfd, arr, sizeof(arr), 0);if(a < 0 ){ERR_MSG("recv");return -1;}if(a == 0){printf("对端关闭发送结束\n");printf("[%s:%d]\n",inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));//客户端的端口 ipbreak;}printf("[%s:%d]\n",inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));//客户端的端口 ipprintf("对端成功接收\n");printf("客户端信息:%s\n", arr);//向客户端发送数据printf("请输入需要发送的数据-->");fgets(crr,sizeof(crr), stdin);b = send(newfd, crr, sizeof(crr), 0);printf("发送成功");}
}
现象

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

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

相关文章

2014年第三届数学建模国际赛小美赛A题吹口哨解题全过程文档及程序

2014年第三届数学建模国际赛小美赛 A题 吹口哨 原题再现&#xff1a; 哨子是一种小装置&#xff0c;当空气被迫通过开口时会发出声音。哨声的巨大而引人注目&#xff0c;使其对警察和体育裁判来说至关重要。当救生员、迷路的露营者或犯罪受害者使用它们时&#xff0c;它们可以…

网站显示不安全警告怎么办?消除网站不安全警告超全指南

网站显示不安全警告怎么办&#xff1f;当用户访问你的网站&#xff0c;而您的网站没有部署SSL证书实现HTTPS加密时&#xff0c;网站就会显示不安全警告&#xff0c;这种警告&#xff0c;不仅有可能阻止用户继续浏览网站&#xff0c;影响网站声誉&#xff0c;还有可能影响网站在…

阿赵UE学习笔记——5、创建关卡元素

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   之前介绍了从空白模板创建关卡&#xff0c;接下来尝试着在这个空白的世界里面&#xff0c;创建一些内容。 一、创建地面 1、创建面片作为地面 创建——形状——平面&#xff0c;可以创建一个面片 在细节面板设置合适的…

分布式锁竟然这么简单?(荣耀典藏版)

大家好&#xff0c;我是小月夜枫&#xff0c;作为一个后台开发&#xff0c;不管是工作还是面试中&#xff0c;分布式一直是一个让人又爱又恨的话题。它如同一座神秘的迷宫&#xff0c;时而让你迷失方向&#xff0c;时而又为你揭示出令人惊叹的宝藏。 今天&#xff0c;让我们来…

项目零散记录

Ts托管 仅本项目禁用本地vscode内置的ts服务 提交代码前的检查 husky(哈士奇)工具&#xff08;是一个git hooks工具&#xff09; 1、安装 pnpm dlx husky-init && pnpm install安装的时候&#xff0c;出现如下报错 解决方案&#xff0c;需要先执行git init初始化…

Android10.0 人脸解锁流程分析

人脸解锁概述 人脸解锁即用户通过注视设备的正面方便地解锁手机或平板。Android 10 为支持人脸解锁的设备在人脸认证期间添加了一个新的可以安全处理相机帧、保持隐私与安全的人脸认证栈的支持&#xff0c;也为安全合规地启用集成交易的应用&#xff08;网上银行或其他服务&am…

Java Web基础详解

回顾 之前的两篇的文章已经大概的带我们了解了tomcat的一些基本的操作&#xff0c;比如从零搭建我们自己的调试环境以及官方文档构建的方式&#xff0c;接下来的话&#xff0c;我将带大家来了解一下tomcat的一些基础知识&#xff0c;这些基础知识将以问题的方式抛出&#xff0…

【SpringCloud笔记】(11)消息驱动之Stream

Stream 技术背景 底层不同模块可能使用不同的消息中间件&#xff0c;这就导致技术的切换&#xff0c;微服务的维护及开发变得麻烦起来 概述 官网&#xff1a; https://spring.io/projects/spring-cloud-stream#overview https://cloud.spring.io/spring-cloud-static/spring…

最小覆盖子串(LeetCode 76)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路参考文献 1.问题描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对于 t 中重复字符&#xff…

git 常用基本命令, reset 回退撤销commit,解决gitignore无效,忽略记录或未记录远程仓库的文件,删除远程仓库文件

git 基本命令 reset 撤销commit https://blog.csdn.net/a704397849/article/details/135220091 idea 中 rest 撤销commit过程如下&#xff1a; Git -> Rest Head… 在To Commit中的HEAD后面加上^&#xff0c;点击Reset即可撤回最近一次的尚未push的commit Reset Type 有三…

Flink Has Become the De-facto Standard of Streaming Compute

摘要&#xff1a;本文整理自 Apache Flink 中文社区发起人、阿里巴巴开源大数据平台负责人王峰&#xff08;莫问&#xff09;&#xff0c;在 Flink Forward Asia 2023 主会场的分享。Flink 从 2014 年诞生之后&#xff0c;已经发展了将近 10 年&#xff0c;尤其是最近这些年得到…

爬虫系列----Python解析Json网页并保存到本地csv

Python解析JSON 1 知识小课堂1.1 爬虫1.2 JSON1.3 Python1.4 前言技术1.4.1 range1.4.2 random1.4.3 time.sleep1.4.4 with open() as f: 2 解析过程2.1 简介2.2 打开调试工具2.3 分析网址2.3.1 网址的规律2.3.2 网址的参数 2.4 爬取第一页内容2.5 存入字典并获取2.6 循环主体数…

7-2 设计一元二次方程求解类(高教社,《Python编程基础及应用》习题9-4)——python

设计一个类Root来计算ax2bxc0的根。该类包括&#xff1a;a、b、c共3个属性表示方程的3个系数&#xff0c;getDiscriminant()方法返回b2-4ac, getRoot1()和getRoot2()返回方程的两个根。 其中&#xff0c;getRoot1()返回的根对应&#xff1a; getRoot2()返回的根对应&#xff1a…

百度沧海文件存储CFS推出新一代Namespace架构

随着移动互联网、物联网、AI 计算等技术和市场的迅速发展&#xff0c;数据规模指数级膨胀&#xff0c;对于分布式文件系统作为大规模数据场景的存储底座提出了更高的要求。已有分布式文件系统解决方案存在着短板&#xff0c;只能适应有限的场景&#xff1a; >> 新型分布式…

格密码:傅里叶矩阵

目录 一. 铺垫性介绍 1.1 傅里叶级数 1.2 傅里叶矩阵的来源 二. 格基与傅里叶矩阵 2.1 傅里叶矩阵详细解释 2.2 格基与傅里叶矩阵 写在前面&#xff1a;有关傅里叶变换的解释太多了&#xff0c;这篇博客主要总结傅里叶矩阵在格密码中的运用。对于有一定傅里叶变换基础的同…

IntelliJ IDEA [设置] 隐藏 .idea 等 .XXX 文件夹

文章目录 1. 问题描述2. 解决办法3. 最后效果4. 特殊处理&#xff08;正常不需要此步骤&#xff09;总结 我们使用 IntelliJ IDEA 导入项目的时候&#xff0c;经常会看到一些 .XXX 的文件夹&#xff08;例如&#xff1a;.idea&#xff0c;.mvn&#xff0c;.gradle 等&#xff0…

支付宝、学习强国小程序input、textarea数据双向绑定

前言 和 vue 的绑定有些区别&#xff0c;需要注意。直接 value"{{inputValue}}" 是无法双向绑定的。 正确思路 文档说的比较详细&#xff0c;不过没有组合使用的案例&#xff0c;需要自行理解。这里正确的方法是先用 value 绑定数据&#xff0c;再使用 onInput 事件…

鸿蒙的基本项目_tabbar,首页,购物车,我的

以上效果&#xff0c;由四个ets文件实现&#xff0c;分别是容器页面。首页&#xff0c;购物车&#xff0c;我的。 页面里的数据&#xff0c;我是用json-server进行模拟的数据。 一、容器页面 使用组件Tabs和Tabcontent结合。 import Home from "./Home"; import …

短剧付费变现小程序源码系统:开通会员+在线充值+风口项目,变现利器+完整的代码包 附带部署安装教程

在当今数字化时代&#xff0c;短剧付费变现小程序源码系统已经成为了一个热门的风口项目。它以开通会员、在线充值、完整的代码包等特色功能&#xff0c;成为了一种有效的变现利器&#xff0c;受到了广泛的关注和应用。本文将详细介绍这个源码系统的背景和特色功能&#xff0c;…

实现阿里云oss云存储,简单几步

一、前言 虽然平常学习用的不多&#xff0c;但是用的时候再去找官方文档&#xff0c;也很繁琐&#xff0c;不如直接整理以下&#xff0c;方便粘贴复制&#xff0c;本文介绍两种图片上传方式①普通上传②服务端签名直传 1.普通上传 加载maven依赖 <dependency><grou…