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

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.mzph.cn/news/875171.shtml

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

相关文章

【数据结构】单链表面试题(Java + 力扣 + 详解)

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

动态代理更改Java方法的返回参数(可用于优化feign调用后R对象的统一处理)

动态代理更改Java方法的返回参数&#xff08;可用于优化feign调用后R对象的统一处理&#xff09; 需求原始解决方案优化后方案1.首先创建AfterInterface.java2.创建InvocationHandler处理代理方法3. 调用 实际运行场景拓展 需求 某些场景&#xff0c;调用别人的方法&#xff0…

Chapter 15 Python函数进阶

欢迎大家订阅【Python从入门到精通】专栏&#xff0c;一起探索Python的无限可能&#xff01; 文章目录 前言一、函数多返回值二、函数的多种传参方式三、匿名函数 前言 在Python中&#xff0c;函数是组织代码、提高重用性与可读性的基本构建块。随着程序逻辑的复杂性增加&…

在 Windows 上安装 PostgreSQL

官网下载地址&#xff1a; https://www.enterprisedb.com/downloads/postgres-postgresql-downloadsWindows平台 官网直接提供exe安装包&#xff0c;没有手动安装的压缩包 postgresql-14.4-1-windows-x64.exe几个重要的安装选项 安装界面会指定服务程序和库两个路径&#xf…

压测实操--kafka-consumer压测方案

作者&#xff1a;九月 环境信息&#xff1a; 操作系统centos7.9&#xff0c;kafka版本为hdp集群中的2.0版本。 Consumer相关参数 使用Kafka自带的kafka-consumer-perf-test.sh脚本进行压测&#xff0c;该脚本参数为&#xff1a; thread&#xff1a;测试时的单机线程数&…

刷机维修进阶教程-----何谓“tee损坏” 指纹丢失 掉帧 传感器失效?详细修复步骤教程

TEE损坏指的是安卓机型中Key Attestation密钥认证所依赖的可信应用中的证书库被破坏了。然后拒绝为指纹密匙认证提供服务。加密的密匙由TEE负责管理。tee损坏只影响当前机型的密匙认证。不影响加密。通俗的理解。如果你机型维修或者刷机或者解锁或者格机 全檫除分区等等后有异常…

Elasticsearch集群配置-节点职责划分 Hot Warm 架构实践

前言 本文主要讲了ES在节点部署时可以考虑的节点职责划分&#xff0c;如果不考虑节点部署&#xff0c;那么所有节点都会身兼数职&#xff08;master-eligible &#xff0c;data&#xff0c;coordinate等&#xff09;&#xff0c;这对后期的维护拓展并不利&#xff0c;所以本文…

软件测试10 渗透性测试及验收测试

渗透性测试及验收测试 知识回顾 Web UI自动化测试 引入自动化测试需要满足的条件自动化测试流程简述自动化测试的关键技术Selenium页面元素定位方式 目标 了解安全测试的概念了解常见的安全漏洞了解安全测试流程及测试工具的使用理解验收测试的概念掌握Alpha测试和Beta测试…

【React 】开发环境搭建详细指南

文章目录 一、准备工作1. 安装 Node.js 和 npm2. 选择代码编辑器 二、创建 React 项目1. 使用 Create React App2. 手动配置 React 项目 三、集成开发工具1. ESLint 和 Prettier2. 使用 Git 进行版本控制 在现代前端开发中&#xff0c;React 是一个非常流行的框架&#xff0c;用…

【计算机毕业设计】866校企合作管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Git处理Failed to connect to www.google.com port 80: Timed out

Git处理Failed to connect to www.google.com port 80: Timed out 输入提交代码命令&#xff1a;git push -u origin master 报错&#xff1a;fatal: unable to access https://gitee.com/solitudeYu/gerenzhuye.git/: Failed to connect to www.google.com port 80: Timed ou…

AI数字人+城市交通大数据可视化平台,让交通管理与服务更简便、更智能

如今&#xff0c;AI数字人作为科技革命和产业革命的重要驱动力&#xff0c;AI数字人接入城市交通大数据可视化平台&#xff0c;可以有效地将各硬件与业务系统进行深度融合&#xff0c;完成业务闭环。依托AI数字人的应用&#xff0c;使城市交通大数据可视化平台的使用复杂度大幅…

我在Vscode学Java泛型(泛型设计、擦除、通配符)

Java泛型 一、泛型 Generics的意义1.1 在没有泛型的时候&#xff0c;集合如何存储数据1.2 引入泛型的好处1.3 注意事项1.3.1 泛型不支持基本数据类型1.3.2 当泛型指定类型&#xff0c;传递数据时可传入该类及其子类类型1.3.3 如果不写泛型&#xff0c;类型默认是Object 二、泛型…

Elastic 数据分层策略:为弹性及高效的实施而优化

作者&#xff1a;来自 Elastic Michael Calizo, Tim Lee 在 Elastic&#xff0c;我们大多数成功的客户实施都是从单一用例开始的&#xff0c;旨在满足特定的业务需求。Elastic 最初被采用通常是因为开发人员欣赏它提供的功能。然而&#xff0c;由于其灵活性和可定制性&#xff…

Ubuntu安装QQ教程

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

ROS参数服务器增删改查实操C++

ROS参数服务器增删改查实操C 创建功能包参数服务器新增&#xff08;修改&#xff09;参数参数服务器获取参数参数服务器删除参数 ROS通信机制包括话题通信、服务通信和参数服务器三种通信方式&#xff0c;各原理及代码实现如下表 功能博客链接说明VScode配置 ROS 环境VScode创建…

【Vue实战教程】之Vuex状态管理详解

Vuex状态管理 1 Vuex简介 1.1 什么是Vuex Vuex是一个专为Vue.js应用程序开发的状态管理工具。它采用了集中式存储管理应用的所有的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 简单来说&#xff0c;Vuex是一个适用于在Vue项目开发时使用的状态管理…

机器学习 | 回归算法原理——多项式回归

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的最速下降法&#xff08;梯度下降法&#xff09;继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享多项式回归这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目&#xff0c;…

Adaboost集成学习 | Matlab实现基于LSTM-Adaboost长短期记忆神经网络结合Adaboost集成学习多输入单输出时间序列预测

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于LSTM-Adaboost长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 步骤1: 数据准备 收集和整理历史数据。确保数据集经过适当的预处理,如归一…

【人工智能】Transformers之Pipeline(五):深度估计(depth-estimation)

目录 一、引言 二、深度估计&#xff08;depth-estimation&#xff09; 2.1 概述 2.2 技术路径 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pipeline&#xff08…