TCP网络socket编程(面向连接)

news2024/11/14 20:51:50

Tcp面向链接、面向字节流和文件的读写非常类似():客户端创建套接字主动建立连接,服务器监听套接字一直等待连接的到来,监听到一个,就创建一个新的套接字用于IO

服务器:

创建套接字:
在这里插入图片描述
填充网络信息并绑定
在这里插入图片描述
把套接字设置为监听状态——TCP特有
在这里插入图片描述
根据监听套接字,获取客户端的链接:——TCP特有
在这里插入图片描述
服务器收发消息:
在这里插入图片描述

客户端:

启动时:要传入目标服务器的ip port

创建套接字:
在这里插入图片描述
也是不需要手动绑定客户端socket,在于服务器连接完成后自己会绑定网络信息

虽然客户端自己不用绑定网络信息,但是客户端首先要给服务器发消息,所以也是要为目标服务器填一下server的网络类型结构体,供发送使用,
在这里插入图片描述
和目标服务器建立连接:——TCP特有
在这里插入图片描述
向建立连接成功的套接字中读写数据就完成了数据的发送和接收:
在这里插入图片描述

优化:服务器支持多客户端访问——多进程或者多线程
v2:多进程:在获取连接成功后,创建子进程去执行此次链接成功的客户端的求情;
出现的问题:创建子进程文件描述符表会发生拷贝
父进程的文件描述符表就会随着获取连接成功的次数增加,这样就会造成空间的消耗,所以创建完成之后,父子进程应该关闭自己不需要的文件描述符,(父进程关闭新建文件描述符,子进程关闭监听文件描述符)
在这里插入图片描述
但是即使这样还是有个问题:子进程的退出需要父进程等待,如果父进程等待就是阻塞式的等待,那么任然不能实现多客户端连接,
解决方案:子进程再创建一个子进程(孙子进程),然后让子进程退出,孙子进程去完成收发;
在这里插入图片描述
v3:多进程信号版

signal(SIGCHLD,SIG_IGN);//对SIG_IGN信号进行忽略,子进程退出后不用等待自动释放

就不用创建孙子进程,因为父进程不用等待了,就直接用子进程执行收发
在这里插入图片描述
v4:多线程
主线程和新线程不需要关闭所谓的文件描述符,因为他们是共享文件描述符表的如果一个关闭,另外一个也就看不到了
问题:主线程也是会阻塞等待:解决:子线程和主主线程分离

//         pthread_detach(pthread_self());//把自己分离

但是子线程要执行的函数传参的时候如果只传socket的话,因为主线程会一直去监听创建新的socket,所以socket的值是一直变化的不能直接传给子线程执行,要在建立子线程之前先把他保存起来:

//创建一个类用来保存可靠的保存文件描述符,因为如果是创建多线程来收发消息的话,就要把获取到的文件描述符值传过去,但是主线程又会不停地获取,那么如果直接传&sockfd的话,在主线程再次去获取新的是,sockfd这个变量里面保存的值就会被清空(线程调度)
// class ThreadData
// {
//     public:
//     ThreadData(int sock,TcpServer*ptr,sockaddr_in peer):sockfd(sock),svr_ptr(ptr),addr(peer)
//     {}
//     int Sockfd()
//     {
//     return sockfd;
//     }
//     TcpServer*GetServer() {return svr_ptr;};

//     ~ThreadData()
//     {}

//     private:
//     int sockfd;
//     TcpServer* svr_ptr;
//     public:
//     InetAddr addr;

// };
//   static  void *HandlerRequest(void*args)
//     {
//         ThreadData *td=static_cast<ThreadData*>(args);
//         //主线程和新线程不需要关闭所谓的文件描述符,因为他们是共享文件描述符表的如果一个关闭,另外一个也就看不到了
//         pthread_detach(pthread_self());//把自己分离
//         //现在就可以执行收发喽
//             td->GetServer()->Service(td->Sockfd(),td->addr);
//              close(td->Sockfd());
//        delete td;
//         return nullptr;
//     }

// //v4多线程
        // //把这一次的文件描述符保存起来
        // ThreadData *td=new ThreadData(sockfd,this,peer);
        // pthread_t tid;
        // pthread_create(&tid,nullptr,HandlerRequest,td);

总代码链接
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

区块链和数据要素融合的价值及应用

一、数据要素面临的关键障碍 在构建数据要素基石的过程中&#xff0c;首要任务是明确并解决产权架构的难题&#xff0c;特别是使用权的确立与流转机制的顺畅&#xff0c;此乃数字经济蓬勃发展的命脉所在。一个高效的数据流转体系对于激发数据潜能、加速经济发展及优化数据资源…

TreeSelect增加可筛选功能

TreeSelect官方可筛选示例 <template><el-tree-selectv-model"value":data"data"filterablestyle"width: 240px"/><el-divider /><el-divider />filter node method:<el-tree-selectv-model"value":data&q…

使用torch_pruning对YOLOv8进行剪枝(新版、detect、segment)

torch_pruning库介绍 在结构修剪中&#xff0c;**Group被定义为深度网络中最小的可移除单元。**每个组由多个相互依赖的层组成&#xff0c;需要同时修剪这些层以保持最终结构的完整性。然而&#xff0c;深度网络通常表现出层与层之间错综复杂的依赖关系&#xff0c;这对结构修剪…

[大牛直播SDK]Windows平台RTMP直播推送模块功能设计

技术优势 全自研框架&#xff0c;易于扩展&#xff0c;自适应算法让延迟更低、采集编码传输效率更高&#xff1b;所有功能以SDK接口形式提供&#xff0c;所有状态&#xff0c;均有event回调&#xff0c;完美支持断网自动重连&#xff1b;SDK模块化&#xff0c;可和大牛直播播放…

DBeaver Ultimate 22.1.0 连接数据库(MySQL+Mongo+Clickhouse)

前言 继续书接上文 Docker Compose V2 安装常用数据库MySQL+Mongo,部署安装好之后我本来是找了一个web端的在线连接数据库的工具,但是使用过程中并不丝滑,最终还是选择了使用 DBeaver ,然后发现 mongo 还需要许可,又折腾整理了半下午,终于大功告成。 DBeaver 版本及说明…

SpringBoot集成Sharding-JDBC实现分库分表

本文已收录于专栏 《中间件合集》 目录 版本介绍背景介绍拆分方式集成并测试1.引入依赖2.创建库和表3.pom文件配置3.编写测试类Entity层Mapper接口MapperXML文件测试类 4.运行结果 自定义分片规则定义分片类编写pom文件 总结提升 版本介绍 SpringBoot的版本是&#xff1a; 2.3.…

SpringBoot上传超大文件导致Cannot read more than 2,147,483,647 into a byte array,问题解决办法

问题描述 报错: java.lang.IllegalArgumentException: Cannot read more than 2,147,483,647 into a byte array at org.apache.commons.io.IOUtils.lambda$toByteArray$0(IOUtils.java:2403) ~[commons-io-2.11.0.jar:2.11.0] at org.apache.commons.io.output.Thre…

python每日学习12:pandas库的用法(1)

python每日学习12&#xff1a;pandas库的用法&#xff08;1&#xff09; 安装 pip install pandas设定系统环境 import pandas as pd #设定自由列表输出最多为 10 行 pd.options.display.max_rows 10 # 显示当前 Pandas 版本号 pd.__version__进入jupyter notebook 页面 在终端…

氧气传感器在汽车制氧检测中的应用

在当今汽车工业中&#xff0c;技术的快速发展不仅带来了驾驶安全性和舒适性的显著提升&#xff0c;还为车辆增加了各种智能功能&#xff0c;以应对不同的驾驶环境和需求。氧气传感器作为一种关键的技术装置&#xff0c;在汽车制氧检测系统中的应用&#xff0c;尤其是针对疲劳驾…

困于数字化泥潭的软件公司|专题报告集

数字化专题报告集链接&#xff1a;https://tecdat.cn/?p36964 在探讨企业数字化转型的进程中&#xff0c;软件公司无疑扮演着举足轻重的角色。它们不仅是技术创新的驱动力&#xff0c;更是连接管理与技术的桥梁。然而&#xff0c;正如许多观察家所指出的那样&#xff0c;软件…

每天五分钟计算机视觉:目标检测模型从RCNN到Fast R-CNN的进化

本文重点 前面的课程中,我们学习了RCNN算法,但是RCNN算法有些慢,然后又有了基于RCNN的Fast-RCNN,Fast R-CNN是一种深度学习模型,主要用于目标检测任务,尤其在图像中物体的识别和定位方面表现出色。它是R-CNN系列算法的一个重要改进版本,旨在解决R-CNN中计算量大、速度慢…

jackson序列化(jackson codec)

Jackson 是一个用于 Java 平台的开源 JSON 库&#xff0c;它提供了灵活且高效的方式来处理 JSON 数据的序列化(Java对象 → JSON字符串)和反序列化(JSON 字符串→ Java对象)。 以下是 Jackson 的一些主要特点和功能&#xff1a; 高性能&#xff1a;Jackson 通过使用基于流的处理…

Ubuntu安装QQ教程

Ubuntu安装QQ教程 腾讯更新Linux版的QQ&#xff0c;这里安装一下&#xff1b; 首先&#xff0c;进入官网找到合适对应的安装包&#xff1b; QQLinux版本官网&#xff1a;https://im.qq.com/linuxqq/index.shtml 我们是ubuntu系统选择X86下的deb版本&#xff0c;如果是arm开…

TikTok养号的网络环境及相关代理IP知识

TikTok作为一个流行的短视频分享平台&#xff0c;其用户量非常庞大&#xff0c;很多商家和个人都会使用TikTok来进行引流和推广。由于TikTok的规则和政策限制了每个用户每天发布视频的数量&#xff0c;因此许多用户会使用多个账号来发布更多的视频以提高曝光率。 然而&#xff…

Android Studio Build窗口出现中文乱码问题

刚安装成功的android studio软件打开工程&#xff0c;编译时下方build窗口中中文是乱码。 解决&#xff1a; 可点击studio状态栏的Help—>Edit Custom VM Options &#xff0c;在打开的studio64.exe.vmoptions文件后面添加&#xff1a;(要注意不能有空格&#xff0c;否则st…

FL Studio Producer Edition 21.2.3.4004中文直版及FL Studio 204如何激活详细教程

在数字化音乐制作的浪潮中&#xff0c;FL Studio 24.1.1.4234的发布无疑又掀起了一股新的热潮。这款由Image-Line公司开发的数字音频工作站&#xff08;DAW&#xff09;软件&#xff0c;以其强大的功能和易用的界面&#xff0c;赢得了全球无数音乐制作人的青睐。本文将深入探讨…

python 图片转文字、语音转文字、文字转语音保存音频并朗读

一、python图片转文字 1、引言 pytesseract是基于Python的OCR工具&#xff0c; 底层使用的是Google的Tesseract-OCR 引擎&#xff0c;支持识别图片中的文字&#xff0c;支持jpeg, png, gif, bmp, tiff等图片格式 2、环境配置 python3.6PIL库安装Google Tesseract OCR 3、安…

使用axios请求后端的上传图片接口

安装axios npm install axios 创建input文件上传标签 <input type"file" name"" id"" change"handleChange" /> 使用axios请求后端的图片上传接口 function handleChange(val) {// new FormData() js内置构造函数&#xff0c…

C++入门基础:C++中的常用操作符练习

开头介绍下C语言先&#xff0c;C是一种广泛使用的计算机程序设计语言&#xff0c;起源于20世纪80年代&#xff0c;由比雅尼斯特劳斯特鲁普在贝尔实验室开发。它是C语言的扩展&#xff0c;增加了面向对象编程的特性。C的应用场景广泛&#xff0c;包括系统软件、游戏开发、嵌入式…

【Nginx】Mac电脑安装nginx

使用brew安装nginx brew install nginx查看nginx信息 brew info nginx启动nginx brew services start nginx验证是否启动成功 浏览器输入地址&#xff1a;127.0.0.1:8080 停止服务 brew services stop nginx进入nginx文件目录 cd /opt/homebrew/etc/nginx重启服务 bre…