TCP:建立连接,一对一

要实现多任务并发,就引出了并发模型

一、多进程与多线程

1.在相同资源情况下,进程资源开销大,但其安全性高

2.线程相对于进程资源开销小,且并发量比进程大

①多进程并发基础代码

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/ip.h> /* superset of previous */
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>int init_tcp_http()    
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket error");return -1;}struct sockaddr_in cliaddr;socklen_t clilen = sizeof(cliaddr);struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(51000);seraddr.sin_addr.s_addr = inet_addr("192.168.0.183");int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if (ret < 0){perror("bind error");return -1;}ret = listen(sockfd, 10);if (ret < 0){perror("listen error");return -1;}return sockfd;
}int main(int argc, char const *argv[])
{struct sockaddr_in cliaddr;socklen_t clien = sizeof(cliaddr);int sockfd = init_tcp_http();if(sockfd < 0){return -1;}while(1){int connfd =accept(sockfd,(struct sockaddr *)&cliaddr,&clien);if(connfd < 0){perror("accept error");return -1;}pid_t pid = fork();if(pid > 0){}else if(pid == 0){char buff[1024];while(1){memset(buff,0,sizeof(buff));ssize_t cnt = recv(connfd,buff,sizeof(buff),0);if(cnt < 0){perror("recv error");return -1;}else if(cnt == 0){printf("[%s : %d], online\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));}printf("[%s : %d]  %s\n",inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port),buff);strcat(buff,"----->ok");cnt = send(connfd,buff,sizeof(buff),0);if(cnt < 0){perror("recv error");return -1;}}close(connfd);}}close(sockfd);return 0;
}

②多线程并发基础代码实现

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/ip.h> /* superset of previous */
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>int init_tcp_http()    
{int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket error");return -1;}int optval = 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));struct sockaddr_in cliaddr;socklen_t clilen = sizeof(cliaddr);struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(51000);seraddr.sin_addr.s_addr = inet_addr("192.168.0.183");int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr));if (ret < 0){perror("bind error");return -1;}ret = listen(sockfd, 10);if (ret < 0){perror("listen error");return -1;}return sockfd;
}void *task(void *arg)
{   int connfd = *(int *)arg;char buff[1024] = {0};while(1){memset(buff,0,sizeof(buff));ssize_t cnt = recv(connfd,buff,sizeof(buff),0);if(cnt < 0){perror("recv error");close(connfd);return NULL;}else if(cnt == 0){printf("online\n");break;}printf("buff = %s\n",buff);strcat(buff,"----->ok");cnt = send(connfd,buff,sizeof(buff),0);if(cnt < 0){perror("recv error");close(connfd);return NULL;}}close(connfd);
}int main(int argc, char const *argv[])
{    pthread_t tid; struct sockaddr_in cliaddr;socklen_t clien = sizeof(cliaddr);int sockfd = init_tcp_http();if(sockfd < 0){return -1;}while(1){int connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&clien);if(connfd < 0){perror("accept error");return -1;}pthread_create(&tid,NULL,task,&connfd);pthread_detach(tid); }close(sockfd);return 0;
}

二、线程池

     为了解决多线程或者多进程模型,在服务器运行过程,频繁创建和销毁线程(进程)带来的时间消耗问题。基于生产者和消费者编程模型,以及任务队列等,实现的一套多线程框架。

简单的例子:主线程是一个餐厅,餐厅有四个服务员(此线程),当客人到餐厅就餐时,服务员前去接待,当四个服务员都没有空闲时,客人进行排队,就好比一个队列(先进先出),当服务员空闲来,就去“队列”中接待客人(task)

三、IO多路复用   

I-->O:fd
对多个文件描述符的读写可以复用一个进程。

      在不创建新的进程和线程的前提下,使用一个进程实现对多个文件读写的同时监测

 阻塞IO模式:

1. 多个任务之间是同步的效果

      1)select
2)poll
3)epoll

2.相应函数解释

1)select实现IO多路复用:

      1. 创建文件描述符集合                  fd_set
2. 添加关注的文件描述符到集合   FD_SET();
3. 使用select传递集合表给内核,内核开始监测事件  select()
4. 当内核监测到事件时,应用层select将解除阻塞,并获得相关的事件结果
5. 根据select返回的结果做不同的任务处理

位图为1024是因为文件描述符是0~1023(前三位是标准输出,标准输入,标准出错设备)

       void FD_CLR(int fd, fd_set *set);
int  FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);

这是系统自带的一些带参宏

FD_CLR     是将当前套接字置零

FD_ISSET  检测套接字是否置为1

FD_SET      将定义的套接字插入文件描述符集合

FD_ZERO    将文件描述符全清零

int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds,

                                                                                                 struct timeval *timeout);
功能:传递文件描述符结合表给内核并等待获取事件结果
参数:
nfds :        关注的最大文件描述符+1
readfds:   读事件的文件描述符集合
writefds:   写事件的文件描述符集合
exceptfds:其他事件的文件描述符集合
timeout:    设置select监测时的超时时间
NULL : 不设置超时时间(select一直阻塞等待)

        返回值:
成功:返回内核监测的到达事件的个数
失败:-1
0 : 超时时间到达,但没有事件发生,则返回0

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

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

相关文章

Ubuntu 22.04 插入光驱后磁盘满启动故障clean, ...files, ...blocks

硬件环境 设备型号&#xff1a;机械革命 Yilong15Pro Series GM5HG0A操作系统&#xff1a;Ubuntu 22.04.5 LTS (Jammy Jellyfish)内核版本&#xff1a;6.8.0-65-generic 问题经过 初始症状 连接外置光驱后&#xff0c;系统出现异常&#xff1a; 风扇持续高速运转&#xff0c;噪…

声网RTC稳定连麦、超分清晰,出海直播技术不再难选

我们是面向中东、南亚新兴市场的泛娱乐直播平台&#xff0c;主打 1V1 互动、PK 团战与语音房。首个版本落地时&#xff0c;前端开发最焦虑的不是业务逻辑&#xff0c;而是音视频底层问题 —— 延迟高、卡顿多、合唱不同步致观众秒退&#xff0c;我们每周改底层&#xff0c;单 P…

设计模式:桥接模式(Bridge Pattern)

文章目录一、桥接模式的定义二、为什么需要桥接模式&#xff1f;三、示例代码一、桥接模式的定义 桥接模式是一种结构型设计模式&#xff0c;它的主要作用是将抽象部分与实现部分分离&#xff0c;使它们能够独立变化。换句话说&#xff0c;就是把“抽象”和“实现”放到两个独立…

AI-Agent 深度科普:从概念到架构、应用与未来趋势

目录 一、Agent 究竟是什么&#xff1f; 二、Agent 的核心组成模块 三、Agent 架构类型与协作模式 单智能体&#xff08;Single-Agent&#xff09; 多智能体协作&#xff08;Multi-Agent&#xff09; 人机协作&#xff08;Human-in-the-loop&#xff09; 四、Agent 的能…

企业分支上云的常见误区与纠正方案

数字化转型的浪潮下&#xff0c;“上云”几乎成为所有企业的必答题。然而&#xff0c;在实际落地中&#xff0c;很多企业发现&#xff1a;总部上云容易&#xff0c;分支上云却困难重重。不是网络体验不稳定&#xff0c;就是合规风险频出&#xff0c;要么就是成本失控。这其中很…

深入解析函数栈帧创建与销毁

目录 一、函数栈帧&#xff08;Stack Frame&#xff09;整理 1、核心概念 2、为什么需要函数栈帧&#xff1f; 3、函数栈帧的主要内容 二、理解函数栈帧能解决的核心问题 1、局部变量的生命周期与本质 2、函数调用的参数传递机制 3、函数返回值的传递 三、函数栈帧的创…

广告牌安全监测系统综合解决方案

一、方案背景 广告牌作为城市户外广告的重要载体&#xff0c;广泛分布于城市道路、商业区及交通枢纽等人流密集区域。由于长期暴露在自然环境中&#xff0c;广告牌面临着风荷载、雨雪侵蚀、温度变化等多重因素的影响&#xff0c;其结构安全性和稳定性直接关系到公共安全。近年来…

MII的原理

一、介绍 MII 是 Media Independent Interface&#xff08;媒体独立接口&#xff09; 的缩写&#xff0c;是一种用于连接网络物理层&#xff08;PHY&#xff09;芯片和数据链路层&#xff08;MAC&#xff09;芯片的标准硬件接口&#xff0c;核心作用是让不同类型的物理层&…

【Excel】Excel的工作场景

一、Excel的发展历史 1.1 版本迭代周期 自Excel 2019版本起&#xff0c;微软将更新周期稳定在每3年一次&#xff0c;而3年的周期刚好平衡了创新与稳定&#xff1a;既能紧跟大数据时代下用户对自动化、智能化处理的需求&#xff08;比如近年数据量激增带来的批量处理需求&#x…

nestjs 连接redis

1、下载npm install --save nestjs-modules/ioredis ioredis2、全局模块中引用RedisModule.forRootAsync({useFactory: (configService: ConfigService) > {return {type:"single",url: configService.get(redis.url) };},inject: [ConfigService], }),整体如下&…

需求管理需要哪些角色配合

需求管理是项目管理的关键组成部分&#xff0c;它确保项目目标得到准确理解并能顺利实现。有效的需求管理需要多个角色的紧密配合&#xff0c;包括项目经理、产品经理、需求分析师、开发人员、测试人员等。这些角色共同协作&#xff0c;确保需求从收集、分析、实施到验证的每一…

SqlHelper类的方法详细解读和使用示例

在 C# 数据库编程中&#xff0c;SqlHelper类是简化 SQL Server 操作的重要工具&#xff0c;它封装了ADO.NET的底层细节&#xff0c;让开发者能更专注于业务逻辑。以下从方法原理、使用示例和实战技巧三个方面进行详细说明。 一、SqlHelper 核心方法原理与对比 SqlHelper的方法…

智能一卡通系统通过集成身份识别、权限管理、数据联动等技术,实现多场景一体化管理。以下是多奥基于最新技术趋势和应用案例的系统解析

智能一卡&#xff08;码、脸&#xff09;通系统包括消费系统、梯控、门禁、停车场管理、访客机等&#xff0c;需要了解这些系统的集成应用和最新技术发展。多奥打算从以下几个维度来讲解。智能一卡通系统的整体架构和主要功能模块各子系统(门禁、梯控、停车场、访客管理等)的技…

嵌入式学习日志————USART串口协议

1.通信接口通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发名称引脚双工时钟电平设备USARTTX&#xff08;数据发送脚&#xff09;、RX&#xff08;数据接收脚…

微软硬件笔试面试核心题型详细解析

微软硬件笔试面试核心题型详细解析 本专栏预计更新90期左右。当前第42期-笔试面试核心题型详细解析. 本文一共4个章节,核心内容如下。 微软作为全球顶尖的科技公司,其硬件工程师的选拔标准极高。笔试不仅考察扎实的理论基础,更注重解决实际问题的能力、对新技术的理解以…

CMake构建学习笔记21-通用的CMake构建脚本

在之前使用CMake构建程序的脚本&#xff08;CMake构建学习笔记-目录&#xff09;中&#xff0c;大部分内容都有比较强的相似性&#xff0c;那么是不是可以这些相似的内容提取出来作为一个单独的脚本&#xff0c;在构建具体的程序的时候再去调用这个脚本呢&#xff1f;这样做的好…

无人机和无人系统的计算机视觉-人工智能无人机

无人机和无人系统的计算机视觉-人工智能无人机将计算机视觉与无人系统相结合&#xff0c;可以提升其自主或半自主执行复杂任务的能力。这些系统将图像数据与其他机载传感器&#xff08;例如 GNSS/GPS、IMU、LiDAR 和热像仪&#xff09;融合&#xff0c;以解读周围环境并执行精确…

【开题答辩全过程】以 基于hadoop架构的教学过程监控系统为例,包含答辩的问题和答案

个人简介&#xff1a;一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧…

坎坷基金路

2025年8月27日上午10:59从基金委官网上中外合作入口查到自己的基金中了。心情顿时五味杂陈&#xff0c;回想起写基金忙碌的9个月&#xff0c;各位专家对我的指导&#xff0c;嘴角楠楠的说&#xff1a;感恩。自己觉着比较重要的几个点&#xff1a;1、立意必须基于自己的过往研究…

[n8n]

docs&#xff1a;n8n工作流管理系统 本项目帮助管理和探索n8n工作流。 它能自动扫描和分析工作流文件&#xff0c;提取关键信息如名称、触发器和关联服务。 所有数据将存入可搜索的数据库&#xff0c;并通过REST API提供访问。 可以快速定位特定工作流、查看详细描述&#xff0…