网络I/O学习(一)
一、什么是网络IO?
就是客户端和服务端之间的进行通信的通道(fd)。
二、网络IO通信步骤
1、建立套接字
int socketfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in servaddr;
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //绑定0.0.0.0,Linux上有三张网卡,eth0:桥接,eth1:NAT,lo:回环,// 0.0.0.0代表任意一个收到数据都行,也可以绑定固定网卡上的ip地址
servaddr.sin_port = htons(2000); // 0~1023:系统使用,1024以后用户可以使用
if (-1 == bind(socketfd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr)))
{cout << "bind failed:" << strerror(errno) << endl;
}
2、实现监听
listen(socketfd, 10); //监听struct sockaddr_in clientaddr; //创建一个客户端用于接受数据
socklen_t len = sizeof(clientaddr);
cout<<"current socketfd:"<<socketfd<<endl;
int clientfd = accept(socketfd, (struct sockaddr*)&clientaddr, &len);
cout<<"clientfd is:"<<clientfd<<endl;
netstat -anop | grep 2000 #新建一个窗口,输入该命令查看绑定的2000端口状态, 22查ssh,3306查mysql,6309查redis
如果再开一个窗口执行监听,那么会报错
3、接受数据 fd与tcp连接,io通道建立成功
会一直阻塞等待数据的到来
char buffer[1024] = {0};
int count = recv(clientfd, buffer, 1024, 0);
cout<<"buffer:"<<buffer<<endl;
4、返回信息
count = send(clientfd, buffer,count, 0);
5、由于代码中只存在两个fd,socketfd和clientfd
当存在一个客户端连接服务端时,可以正常收发消息;但当出现多个客户端连接服务端时,只有一个客户端能发信息,其余
客户端不能发送信息
客户端发送消息结果:
小结:
虽然3个客户端都连接服务端成功,但最终通信成功的只有一个,acept就调用成功一次就结束了,自然就接收不到其余两个客户端的数据
优化代码:
while (true){cout<<"current socketfd:"<<socketfd<<endl;int clientfd = accept(socketfd, (struct sockaddr *)&clientaddr, &len);cout<<"clientfd is:"<<clientfd<<endl;char buffer[1024] = {0};int count = recv(clientfd, buffer, 1024, 0);cout << "buffer:" << buffer << endl;//返回信息count = send(clientfd, buffer, count, 0);}
小结:
虽然都通信成功,但只能发送一次消息,无法发送第二次消息,在acept这进行了阻塞,而且必须根据连接顺序来处理信息,
比如连接顺序是1号,2号,3号客户端,3号连发3次消息,2号连发2次消息,此时服务端仍然没反应,在等待1号发消息,
1号发消息,然后服务端依次处理,将2号的2次消息,3号的3次消息全部发出,然后阻塞,需要有新的连接,然后才能处理消息。
存在两个问题:
1、无法实时响应。
2、一次性连接处理信息问题
三、多个IO如何接收数据
1、解决实时性问题和一次性连接处理问题
当多个客户端连接服务器时,accept会进行阻塞,等待第一个用户数据接收完之后,才处理第二个用户的请求…
解决方案:
采用多线程来解决。
void *ClientPthread(void *arg)
{int clientfd = *(int *)arg;while(true){cout<<"clientfd is:"<<clientfd<<endl;char buffer[1024] = {0};int count = recv(clientfd, buffer, 1024, 0);cout << "buffer:" << buffer << endl;//返回信息count = send(clientfd, buffer, count, 0);}
}while (true){cout<<"current socketfd:"<<socketfd<<endl;int clientfd = accept(socketfd, (struct sockaddr *)&clientaddr, &len);pthread_t p_id;pthread_create(&p_id, NULL, ClientPthread, &clientfd);}
2、讨论fd的值
无论什么时候连接,或者多个客户端连接,发现socketfd的值永远是3,而接收客户端返回的fd却是在3的基础上+1
那么fd,0,1,2去哪了
ls /dev/fd
原来这三个值分别是代表标准输入,输出以及错误
那允许多少客户端连接呢,fd是个整数,肯定也存在一定的范围
ulimit -a
当前最多只支持到这么多
3、fd支持有限,那客户端断开连接后,原来的fd还能用吗?
答案是肯定的,系统有自己的回收策略
int count = recv(clientfd, buffer, 1024, 0);if(count == 0){ //断开close(clientfd); //必须要有close,不然系统不会回收fd资源break;}
相关文章:

网络I/O学习(一)
一、什么是网络IO? 就是客户端和服务端之间的进行通信的通道(fd)。 二、网络IO通信步骤 1、建立套接字 int socketfd socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in servaddr; servaddr.sin_family AF_INET; servaddr.sin_addr.s_addr htonl(INADDR_A…...
4:OpenCV—保存图像
将图像和视频保存到文件 在许多现实世界的计算机视觉应用中,需要保留图像和视频以供将来参考。最常见的持久化方法是将图像或视频保存到文件中。因此,本教程准备解释如何使用 OpenCV C将图像和视频保存到文件中。 将图像保存到文件 可以学习如何保存从…...

Selenium-Java版(css表达式)
css表达式 前言 根据 tag名、id、class 选择元素 tag名 #id .class 选择子元素和后代元素 定义 语法 根据属性选择 验证CSS Selector 组选择 按次序选择子节点 父元素的第n个子节点 父元素的倒数第n个子节点 父元素的第几个某类型的子节点 父元素的…...

产品更新丨谷云科技 iPaaS 集成平台 V7.5 版本发布
五月,谷云科技 iPaaS 集成平台保持月度更新, V7.5 版本于近日正式发布。我们一起来看看新版本有哪些升级和优化。 核心新增功能:深化API治理,释放连接价值 API网关:全链路可控,精准管控业务状态 业务状态…...

深度学习让鱼与熊掌兼得
通常,一个大的复杂的模型的loss会低,但是拟合方面不够,小的模型在拟合方面更好,但是loss高,我们可以通过深度学习来得到一个有着低loss的小模型 我们之前学过,peacewise linear可以用常数加上一堆这个阶梯型函数得到,然后因为peacewise linear可以逼近任何function,所以理论上…...

TDuckX 2.6 正式发布|API 能力开放,核心表单逻辑重构,多项实用功能上线。
大家好,TDuckX 2.6 已正式发布。 本次更新以可集成性提升、数据处理能力增强和交互体验优化为核心,新增了包括 新增OpenAPI 模块、表单数据批量修改、字段导出分列 等多个面向开发者和实际业务落地场景的功能。 我们也重构了部分底层逻辑模块ÿ…...
LeetCode Hot100刷题——除自身以外数组的乘积
238. 除自身以外数组的乘积 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&a…...

JAVA EE(进阶)_进阶的开端
别放弃浸透泪水的昨天,晨光已为明天掀开新篇 ——陳長生. ❀主页:陳長生.-CSDN博客❀ 📕上一篇:JAVA EE_HTTP-CSDN博客 1.什么是Java EE Java EE(Java Pla…...
PDF批量合并拆分+加水印转换 编辑 加密 OCR 识别
各位办公小能手们!你们有没有遇到过被PDF文件折腾得晕头转向的时候呀?其实啊,有专门处理、编辑、管理和优化PDF文件的软件,那就是PDF工具。它功能老多了,有文档格式转换、内容编辑、页面管理、安全保护这些核心功能。下…...
Go语言交替打印问题及多种实现方法
Go语言交替打印问题及多种实现方法 在并发编程中,多个线程(或 goroutine)交替执行任务是一个经典问题。本文将以 Go 语言为例,介绍如何实现多个 goroutine 交替打印数字的功能,并展示几种不同的实现方法。 Go 语言相关…...

ArcGIS Pro调用多期历史影像
一、访问World Imagery Wayback,基本在我国范围 如下图: 二、 放大到您感兴趣的区域 三、 查看影像版本信息 点击第二步的按钮后,便可跳转至World Imagery (Wayback 2025-04-24)的相关信息。 四 、点击上图影像版本信息,页面跳转…...
10.11 LangGraph多角色Agent开发实战:生产级AI系统架构与性能优化全解析
LangGraph 项目:High-level API for Multi-actor Agents 关键词:LangGraph 多角色 Agent, 状态管理, 持久化机制, 工作流编排, 生产级 AI 系统 1. LangGraph 设计哲学与架构演进 LangGraph 是 LangChain 生态中首个面向 多角色协作 Agent 的高阶 API 框架,其核心设计思想可…...

组态王|组态王中如何添加西门子1200设备
哈喽,你好啊,我是雷工! 最近使用组态王采集设备数据,设备的控制器为西门子的1214CPU, 这里边实施边记录,以下为在组态王中添加西门子1200PLC的笔记。 1、新建 在组态王工程浏览器中选择【设备】→点击【新建】。 2、选择设备 和设备建立通讯要通过对应的设备驱动。 在…...
发布时将多个bpl 打包成一个bpl的方法,或者说:不需要vcl60.bpl情况下 18.5K的exe 照常可以运行。
其实这种方式 就是把项目的逻辑和业务 和 依赖分开。 控件和IDE 相对来说一段时间内不会改变。 更新只是更新一些项目的逻辑,例如你在代码里多写了一个 if ,这样就可以只更新这个极小的exe。 题:关于bpl发布时将vcl60.bpl,vcld…...

6.2.2邻接表法-图的存储
知识总览: 为什么要用邻接表 因为邻接矩阵的空间复杂度高(O(n)),且不适合边少的稀疏图,所以有了邻接表 用代码表示顶点、图 声明顶点图信息 声明顶点用一维数组存储各个顶点的信息,一维数组字段包括2个,每个顶点的…...

C++23 放宽范围适配器以允许仅移动类型(P2494R2)
文章目录 引言背景与动机提案内容与实现细节提案 P2494R2实现细节编译器支持 对开发者的影响提高灵活性简化代码向后兼容性 示例代码总结 引言 C23 标准中引入了许多重要的改进,其中一项值得关注的特性是放宽范围适配器(range adaptors)以允…...

【技海登峰】Kafka漫谈系列(十一)SpringBoot整合Kafka之消费者Consumer
【技海登峰】Kafka漫谈系列(十一)SpringBoot整合Kafka之消费者Consumer spring-kafka官方文档: https://docs.spring.io/spring-kafka/docs/2.8.10/reference/pdf/spring-kafka-reference.pdf KafkaTemplate API: https://docs.spring.io/spring-kafka/api/org/springframe…...
Spring Boot三层架构设计模式
Spring Boot 的三层架构设计模式是一种经典的软件分层设计模式,旨在将应用程序划分为 表现层(Controller)、业务逻辑层(Service)、数据访问层(Repository/DAO),通过清晰的职责划分提…...
在Java中调用Ant命令
在Java中调用Ant命令 在Java程序中调用Ant命令有几种方法,下面介绍两种常用的方式: 1. 使用Runtime.exec()方法 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class AntRunner {public stat…...

WebRTC技术下的EasyRTC音视频实时通话SDK,助力车载通信打造安全高效的智能出行体验
一、方案背景 随着智能交通与车联网技术的飞速发展,车载通信在提升行车安全、优化驾驶体验以及实现智能交通管理等方面发挥着越来越重要的作用。传统的车载通信方式在实时性、稳定性以及多媒体交互能力上存在一定局限,难以满足现代车载场景日益复杂的…...

数据科学和机器学习的“看家兵器”——pandas模块 之二
目录 pandas 模块介绍 4.2 pandas 数据读取 4.2.1 课程目标 4.2.2 读取 Excel 文件中的数据 (一)读取某个工作表中的数据 (二)读取指定数据列的标签内容 (三)读取指定数据行的标签内容 (四)读取指定行或者列 4.2.3、读取 CSV 文件数据 4.2.4、课程总结回顾 4.2.5、课后…...
本地部署Firecrawl+Dify调用踩坑记录
最近自己研究Dify,使用到Firecrawl这个比较好用的工具。用Firecrawl官网的不知道为什么总是卡住得不到结果,于是我打算自己去本地部署一个。好家伙真给我人搞麻了,太多问题了。 我是在京东云上面租的一台服务器。 首先就是docker的安装&…...

MySQL--day2--基本的select语句
(以下内容全部来自上述课程) SQL概述 结构化查询语句 1. SQL分类 DDL:数据定义(definition)语言:create、drop、alter… DML:数据操作(manipulation)语言ÿ…...
什么是dom?作用是什么
DOM 的定义 DOM(Document Object Model,文档对象模型)是 HTML 和 XML 文档的编程接口。它将文档解析为一个由节点和对象组成的树状结构,允许开发者通过编程方式动态访问和操作文档的内容、结构和样式。 DOM 的作用 DOM 的主要作…...
Trae - 国人Cursor的免费平替产品
前情提要:Cursor-零基础使用flutter完成贪吃蛇游戏-迄今为止世上最牛的AI编辑工具,不需要程序员也可以编程 Cursor 不是我的最佳选择 Cursor 是基于 VSCode 进化而来,虽然好用,但总结下来有几点点是我有所顾虑的。 第一&#x…...

自动化:批量文件重命名
自动化:批量文件重命名 1、前言 2、效果图 3、源码 一、前言 今天来分享一款好玩的自动化脚:批量文件重命名 有时候呢,你的文件被下载下来文件名都是乱七八糟毫无规律,但是当时你下载的时候没办法重名或者你又不想另存为重新重…...
Jsoup库和Apache HttpClient库有什么区别?
Jsoup 和 Apache HttpClient 是两个功能不同的库,它们在 Java 开发中被广泛使用,但用途和功能有明显的区别: Jsoup 用途:Jsoup 是一个用于解析 HTML 文档的库。它提供了非常方便的方法来抓取和解析网页内容,提取和操作…...

学习!FastAPI
目录 FastAPI简介快速开始安装FastApiFastAPI CLI自动化文档 Reqeust路径参数Enum 类用于路径参数路径参数和数值校验 查询参数查询参数和字符串校验 请求体多个请求体参数嵌入单个请求体参数 CookieHeader表单文件直接使用请求 ResponseResponse Model多个关联模型 响应状态码…...
Linux 安装 Unreal Engine
需要对在unreal engine官网进行绑定github账号,然后到unreal engine github仓库中进行下载对应的版本,并进行安装unreal engine官网 github地址...

【第三十六周】LoRA 微调方法
LoRA 摘要Abstract文章信息引言方法LoRA的原理LoRA在Transformer中的应用补充其他细节 实验与分析LoRA的使用论文实验结果分析 总结 摘要 本篇博客介绍了LoRA(Low-Rank Adaptation),这是一种面向大规模预训练语言模型的参数高效微调方法&…...