【Linux】TCP并发网络编程

news2024/11/28 12:51:25

多线程网络编程

上一节我们讲到,当我们的多个客户端区连接同一个服务端的时候就会出现问题,这是因为一个返回值只能接收一个客户端传输的消息,那么我们想要多个客户端同时链接服务端,我们就要有这样一个思路,发过来一个数据我们就建立一个返回值,那么这里肯定是想到使用循环的办法,但是我们循环之间要靠媒介,这里就想到了我们的多线程,每次传输一个数据,我们就建立一个新的线程

那么这样就可以解决我们的问题。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
int main()
{
    int sockfd = socket(AF_INET,SOCK_STREAM,0);//创建套接字 
    if ( sockfd == -1 )
    {
        exit(0);
    }
 
    struct sockaddr_in saddr, caddr;
    memset(&saddr,0,sizeof(saddr));
    saddr.sin_family = AF_INET;//地址族
    saddr.sin_port = htons(6000);//端口号
    saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //
 
    int res = bind(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));//指定套接字的 地址(ip  port)
    if ( res == -1 )
    {
        printf("bind err\n");
        exit(0);
    }
 
    listen(sockfd,5);//设置监听队列大小
 
    while( 1 )
    {
        int len = sizeof(caddr);//caddr客户端的地址
        int c = accept(sockfd,(struct sockaddr*)&caddr,&len);
        if ( c < 0 )
        {
            continue;
        }
        printf("accept c=%d\n",c);
 
        char buff[128] = {0};
        int n = recv(c,buff,127,0);//read  接收数据
        printf("buff=%s\n",buff);
 
        send(c,"ok",2,0);
 
        close(c);
 
    }
 
 
 
}

 这是我们第一次编写网络编程的时候的服务端代码

因为这里用到了线程函数 因此我们编译时要加上 -lpthread

我们通过 accept的返回值来确定是否链接成功 如果链接成功 

accept的返回值为零是我们目前唯一判断建立连接不成功的证明

然后它的每一个返回值可以和一个客户端建立连接

那么我们使用多线程想建立一个怎样的模型呢

就是和上次不同的是我们使用线程来实现多个accept

那么我们对服务端的代码的修改如下

 

 

 

这样我们就完成了多线程网络编程的服务端的代码的修改

那么我们建立连接客服端 客户端的代码不用修改

但是要保持和服务器端的ip地址一致

 

 

 

 

我们可以看到 修改后的服务端成功的和各个客户端建立了连接并且完成了数据传输

 接下来我们要介绍并发网络编程的一个机制

我们修改一下服务器端的代码

我们让它每次只接收一个字符

我们编译运行连接客户端

 

可以看到它输出是一个一个将 hell0输出出来

 

 

它第一次明明是输出了五个字符确打印了一个ok

第二次输出三个字符但是打印四个ok

这是为什么呢

这里就涉及到了我们的 recv函数的缓冲区

也就是说我们第一次输出五个字符的时候

缓冲区满了 使用阻塞住 只打出了一个ok

 

 

这就是造成这样结果的根源

多进程网络编程

刚刚的问题我们用多进程同样可以实现

那么我们再对刚刚的代码进行一点修改

然后我们编译运行并且与客户端建立通信

 

 

 

我们可以看到成功建立了通信 但是如果我们结束一个客户端

 

我们看到出现了僵尸进程

因为子进程比父进程先结束

那么按照我们以往的理解 再加入一个wait函数等待父进程结束

其实我们加入之后就会发现 如果只添加wait函数 那么 服务器端就会阻塞无法响应

因为我们单单只有wait函数就会让服务器端阻塞

解决办法是 我们知道子进程结束时会给 父进程一个SIGCHID信号

那么当父进程接收到这个信号时我们设置响应状态为不做响应

那么她就可以不被阻塞并且消除掉僵尸进程的情况

 

 

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

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

相关文章

金三银四?铜三铁四才对吧......

往年的金三银四&#xff0c;今年被戏称为“铜三铁四”。知名的大厂HR们都在不断的裁员&#xff0c;能被保住不被裁掉可能就万事大吉了&#xff0c;赛道越来越窄&#xff0c;都在预测未来计算机行业是不是下一个土木工程&#xff1f; 我也算是软件测试岗位的老鸟了&#xff0c;…

2.6 尚品汇 day13 二级路由 饿了么ui 表单使用以及验证(不完整)、上线后的跨域代理(nginx)

二级路由 1.1路由结构 1.2 引入二级路由 1.2.2配置路由信息 1.3 声明导航 1.4配置路由出口 饿了么ui 表单使用以及验证 使用 1.1.1复制结构 1.1.2 在main.js 按需引入 引入首字母大写&#xff0c;-用大写替代&#xff0c;el省略&#xff0c;一定要引用完整 注意Vue.compon…

Smartbi观点 | ChatGPT还处于初级阶段?然而AI早已打入BI内部

最近&#xff0c;当我们还沉浸在电影《流浪地球2》MOSS所带来的震感时&#xff0c;ChatGPT又火爆社交媒体&#xff0c;成为全球“新顶流”。 官方数据显示&#xff0c;今年1月&#xff0c;平均每天约有1300万独立访客使用 ChatGPT&#xff0c;累计用户超1亿&#xff0c;创下了互…

Java 基础面试题——关键字

目录1.Java 中的关键字是指什么&#xff1f;有哪些关键字&#xff1f;2.instanceof 关键字的作用是什么&#xff1f;3.访问修饰符 public、private、protected、以及不写&#xff08;default&#xff09;时的区别&#xff1f;4.Java 中有没有 goto 关键字?5.在 Java 中&#x…

第一章SpringBoot简介

文章目录什么是SpringBoot了解我们的Spring能干什么Spring的生态为什么需要SpringBootSpringBoot优点SpringBoot缺点SpringBoot的大时代背景微服务分布式分布式的困难分布式的解决云原生上云的困难SpringBoot之Helloworld新添我们的maven相关的配置创建一个maven项目并导入依赖…

Seata-Server分布式事务原理加源码(二) - 分布式事务解决方案

分布式事务解决方案 2PC即两阶段提交协议&#xff0c;是将整个事务流程分为两个阶段&#xff0c;P是指准备阶段&#xff0c;C是指提交阶段。 准备阶段&#xff08;Prepare phase&#xff09;提交阶段&#xff08;commit phase&#xff09; 举例&#xff1a;比如说相亲对象两…

微服务项目【秒杀商品展示及商品秒杀】

登录方式调整 第1步&#xff1a;从zmall-common的pom.xml中移除spring-session-data-redis依赖 注意&#xff1a; 1&#xff09;本次不采用spring-session方式&#xff0c;改用redis直接存储用户登录信息&#xff0c;主要是为了方便之后的jmeter压测&#xff1b; 2&#xff09…

魔兽世界WOW私服架设详细教程

1. 写在前面&#xff1a;此教程是针对国服WOW3.3.5.13930版本的&#xff0c;因为目前魔兽单机在此版本下运行最正常。WOW4.0以上版本还有些许问题2. 准备文件&#xff08;1&#xff09;WOW3.3.5.13930客户端&#xff0c;没有的可以从这里下载WOW 3.3.2安装文件和WOW3.3.2-3.3.5…

【linux C】daemon函数应用之——进程守护小工具,运维仔看了都说好!并附带shell版本

最近接触到Linux C中的daemon函数&#xff0c;顾名思义&#xff0c;它和守护进程Daemon有关&#xff1b;简单来说Linux Daemon&#xff08;守护进程&#xff09;是运行在后台的一种特殊进程&#xff1b; 一般来说&#xff0c;它独立于控制终端并且周期性地执行某种任务或等待处…

认识V模型、W模型、H模型

软件测试与软件工程息息相关&#xff0c;软件测试是软件工程组成中不可或缺的一部分。 在软件工程、项目管理、质量管理得到规范化应用的企业&#xff0c;软件测试也会进行得比较顺利&#xff0c;软件测试发挥的价值也会更大。 要关注软件工程、质量管理以及配置管理与软件测试…

ChatGPT中文网尝鲜,感觉自己快下岗了

最近很火的ChatGPT之初体验 ChatGPT中文网 居然可以回答代码问题 尝试了一下, 它居然说自己是一个人 顺便问了下简单的java代码问题 “使用java语言写一个递归打印D盘中所有文件名的程序” 很流畅的回答了出来,注释还写得比我详细,感觉我离下岗不远了 这就是GPT写的代码 i…

工人不戴安全帽自动检测识别 opencv

工人不戴安全帽自动检测识别通过pythonopencv深度学习网络模型&#xff0c;工人不戴安全帽自动检测识别算法对现场人员穿戴进行全天候不间断识别检测&#xff0c;发现现场人员违规行为着装自动抓拍存档。Python是一门解释性脚本语言。解释性语言&#xff1a;解释型语言&#xf…

C语言中大小端问题

目录 一、什么是大小端 二、 举个例子 三、大小端演示 四、解释"二"中举例的问题 ​五、怎么判断是大端还是小端 六、一个题目 一、什么是大小端 大端模式&#xff08;大端字节序存储&#xff09;&#xff1a;就是高位字节数据存放在内存的低地址端&#xff…

工序排序问题--约翰逊法精讲

什么是约翰逊法?约翰逊法是作业排序中的一种排序方法。选出最短加工时间i*&#xff0c;若最短加工时间有多个&#xff0c;任选1个.若i*出现在机床1&#xff0c;它对应的工件先安排加工&#xff0c;否则放在最后安排&#xff0c;安排后划去该工件,重复上两个步骤&#xff0c;直…

python3.11下载安装详细教程

python3.11新的功能特性 1. 支持新的字符串格式化功能&#xff0c;允许使用更多的格式化选项&#xff1b; 2. 支持新的数据类型&#xff0c;如结构化数据类型&#xff1b; 3. 支持新的编程模型&#xff0c;如asyncio&#xff1b; 4. 支持新的编程语言特性&#xff0c;如f-s…

别在用scroll去做懒加载了,交叉观察器轻松搞定

Ⅰ、前言 「懒加载」是网页中非常 常见的&#xff1b;为了减少系统的压力&#xff0c;对于一些电商系统出场频率非常高&#xff1b;那么大家一般用什么方式去实现 「懒加载」 呢 &#xff1f; ① 通过 scroll 的形式&#xff1a; 通过 滚动「scroll」事件&#xff0c;然后去判…

浅析 Makefile

Makefile逻辑 Makefile就是将一系列的工作流串在一起自动执行&#xff0c;构成Makefile最基本的要素是目标、依赖、命令。也就是为了实现目标需要哪些依赖并执行什么样的命令。 target: dependences1 dependences2 ... command1 command2 ...其中&#xff0c;target表示要生…

Thinking--FastDom消除浏览器布局抖动

Thinking系列&#xff0c;旨在利用10分钟的时间传达一种可落地的编程思想。 对于大量操作 DOM 的场景&#xff0c;页面时常会出现卡顿现象&#xff0c;导致用户体验不佳。卡顿的原因是由于掉帧导致&#xff01;&#xff01; 掉帧 现在屏幕大部分的固定刷新频率为60Hz&#xf…

30个HTML+CSS前端开发案例(完结篇)

30个HTMLCSS前端开发案例&#xff08;完结篇&#xff09;flex弹性布局-今日头条首页热门视频栏代码实现效果flex弹性布局-微博热搜榜单代码实现效果grid网格布局-360图片展示代码实现效果综合实例-小米商城左侧二级菜单代码实现效果资源包flex弹性布局-今日头条首页热门视频栏 …

Pinia快速入门

Pinia学习1.做什么用的❓2.优势❓3. 介绍❓3.1、与vuex对比与 Vuex 3.x/4.x 的比较#4.实操使用&#x1f4aa;版本须知4.1创建项目4.2运行项目4.3使用pinia安装全局引入挂载使用stategettersactions示例代码分析1.做什么用的❓ 与vuex的作用一致&#xff0c;用于做网页存储的Pin…