SOCKET编程(1):基本概念

基本概念

socket分类

socket提供了**流(stream)数据报(datagram)**两种通信机制,即流socket和数据报socket

流socket基于TCP协议,是一个有序、可靠、双向字节流的通道,传输数据不会丢失、不会重复、顺序也不会错乱

数据报socket基于UDP协议,不需要建立和维持连接,可能会丢失或错乱。UDP不是一个可靠的协议,对数据的长度有限制,但是它的效率比较高

某些应用层协议,出于历史原因,受当时技术和网络条件限制,选择了基于UDP实现,其选择的理由现在很可能已经不再成立了

实时的音视频聊天可能采用的是UDP,这种业务可以接受数据的丢失且不必重传

简单的socket通信流程

在这里插入图片描述

主机字节序和网络字节序

https://www.cnblogs.com/xingguang1130/p/11643446.html

大端、小端字节序

在这里插入图片描述

网络字节序和主机字节序

网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节序采用big endian排序方式

不同的机器主机字节序不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。我们把某个给定系统所用的字节序称为主机字节序(host byte order)。比如x86系列CPU都是little-endian的字节序

由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序

htons(), ntohs(), ntohl(),htonl()函数

ntohs, ntohl, htons,htonl的比较和详解

网络字节序与主机字节序之间的转换函数:**htons(), ntohs(), ntohl(),htonl()**,位于头文件<netinet/in.h>

htons和ntohs完成16位无符号数的相互转换,htonl和ntohl完成32位无符号数的相互转换

htonl()--"Host to Network Long int"     32Bytesntohl()--"Network to Host Long int"     32Byteshtons()--"Host to Network Short int"    16Bytesntohs()--"Network to Host Short int"    16Bytes

在使用little endian的系统中,这些函数会把字节序进行转换

在使用big endian类型的系统中,这些函数会定义成空宏

TCP三次握手与四次挥手

TCP三次握手四次挥手详解

TCP三次握手详解-深入浅出(有图实例演示)

💡 主要是面试时候可能会问,实际编程帮助不大

在这里插入图片描述

TCP报文分包和粘包

分包:发送方发送字符串”helloworld”,接收方却接收到了两个字符串”hello”和”world”

粘包:发送方发送两个字符串”hello”+”wold”,接收方却一次性接收到了"helloworld"

下面的例子中就既有分包也有粘包的情况

服务端:

客户端(127.0.0.1)已连接
接收:这是第1个超级女生,编号001
接收:这是第2个超级女生,编号002这是第3个超级女生,编号003这是第4个超级女生,编号004这是第5个超级女生,编号005这是第6个超级女生,编号006这是第7个超级女生,编号007这是第8个超级女生,编号008这是第9个超级女生,编号009这是第10个超级女生,编号010这是第11个超级女生,编号011这是第12个超级女生,编号012这是第13个超级女生,编号013这是第14个超级女生,编号014这是第15个超级女生,编号015这是第16个超级女生,编号016这是第17个超级女生,编号017这是第18个超级女生,编号018这是第19个超级女生,编号019这是第20个超级女生,编号020这是第21个超级女生,编号021这是第22个超级女生,编号022这是第23个超级女生,编号023这是第24个超级女生,编号024这是第25个超级女生,编号025这是第26个超级女生,编号026这是第27个超级女生,编号027这是第28个超级女生,编号028这是@dq�
接收:第29个超级女生,编号029这是第30个超级女生,编号030这是第31个超级女生,编号031这是第32个超级女生,编号032这是第33个超级女生,编号033这是第34个超级女生,编号034这是第35个超级女生,编号035这是第36个超级女生,编号036这是第37个超级女生,编号037这是第38个超级女生,编号038这是第39个超级女生,编号039这是第40个超级女生,编号040这是第41个超级女生,编号041这是第42个超级女生,编号042这是第43个超级女生,编号043这是第44个超级女生,编号044这是第45个超级女生,编号045这是第46个超级女生,编号046这是第47个超级女生,编号047这是第48个超级女生,编号048这是第49个超级女生,编号049这是第50个超级女生,编号050这是第51个超级女生,编号051这是第52个超级女生,编号052这是第53个超级女生,编号053这是第54个超级女生,编号054这是第55个超级女生,编号055这�@dq�
接收:��第56个超级女生,编号056这是第57个超级女生,编号057这是第58个超级女生,编号058这是第59个超级女生,编号059这是第60个超级女生,编号060这是第61个超级女生,编号061这是第62个超级女生,编号062这是第63个超级女生,编号063这是第64个超级女生,编号064这是第65个超级女生,编号065这是第66个超级女生,编号066这是第67个超级女生,编号067这是第68个超级女生,编号068这是第69个超级女生,编号069这是第70个超级女生,编号070这是第71个超级女生,编号071这是第72个超级女生,编号072这是第73个超级女生,编号073这是第74个超级女生,编号074这是第75个超级女生,编号075这是第76个超级女生,编号076这是第77个超级女生,编号077这是第78个超级女生,编号078这是第79个超级女生,编号079这是第80个超级女生,编号080这是第81个超级女生,编号081这是第82个超级女生,编号082��@dq�

客户端:

发送:这是第51495个超级女生,编号51495
发送:这是第51496个超级女生,编号51496
发送:这是第51497个超级女生,编号51497
发送:这是第51498个超级女生,编号51498
发送:这是第51499个超级女生,编号51499

但是TCP传输数据能保证几点:

  1. 顺序不变,例如发送方发送hello,接收方也一定顺序接收到hello,这个是TCP协议承诺的,因此这点成为我们解决分包和粘包问题的关键
  2. 分割的包中间不会插入其他数据

在实际开发中,为了解决分包和粘包的问题,就一定要自定义一份协议,最常用的方法是:

  • 报文长度+报文内容,如9999helloworld
  • 报文长度ASCII码/或二进制的整数

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

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

相关文章

今天遇到一个GPT解决不了的问题

问题描述 你好&#xff0c;postman的一个post请求&#xff0c;编辑器里面放了一个很长的json数据&#xff0c;报Tokenization is skipped for long lines for performance reasons. This can be configured via editor.maxTokenizationLineLength.&#xff0c;但是同样的数据&a…

Star15.3k,开源数据可视化分析工具项目

好东西来了&#xff0c;这是一个人人可用的开源数据可视化分析工具项目&#xff0c;V 哥迫不及待的要给大家推荐这个项目&#xff0c;帆软、Tableau 等商业 BI 工具的开源替代&#xff0c;已在 Github 上被 Star了15.3k了&#xff0c;大家一起来了解一下。自己搭建起来可用&…

QSplitter分裂器的使用方法

1.QSplitter介绍 QSplitter是Qt框架提供的一个基础窗口控件类&#xff0c;主要用于分割窗口&#xff0c;使用户能够通过拖动分隔条来调节子窗口的大小。 2.QSplitter的添加方法 &#xff08;1&#xff09;通过Qt Creator的界面设计工具添加&#xff1b; &#xff08;2&#xf…

DrissionPage

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;本文章未经许…

RUST 编程语言使构建更安全的软件变得更加容易。RUST ALL THE THINGS 需要什么?

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

机器学习:基于K-近邻(KNN)、高斯贝叶斯(GaussianNB)、SVC、随机森林(RF)、梯度提升树(GBDT)预测葡萄酒质量

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

车辆充电桩|基于Springboot+vue的车辆充电桩管理系统的设计与实现(源码+数据库+文档)

车辆充电桩管理系统 目录 基于Springboot&#xff0b;vue的车辆充电桩管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1 前台功能模块 4.1.1 首页功能 4.1.2 用户后台管理 2 后台功能模块 4.2.1 管理员功能 4.2.2 维修员功能 四、数据库设计 五、核…

公众号流量主的收益怎么样?

公众号之前是一个私域平台&#xff0c;没有粉丝基本是没有推荐的&#xff0c;所以之前入门的门槛还是很高的&#xff0c;但是今年公众号和视频号改变了推流的机制&#xff0c;现在发的文章会进入到流量池中&#xff0c;进入到公域流量&#xff0c;所以发布的优质文章会大爆的&a…

演唱会新风:允许部分歌手闭麦,让观众先唱

演唱会市场的热度从2023年延续至今&#xff0c;出现了一些“倒反天罡”的现象。 例如&#xff1a;让歌迷在台下给歌手唱歌。 5月6日抖音娱乐榜第一的消息是“第一次见辟谣观众没假唱的”。原因是凤凰传奇在常州和北京鸟巢先后举办两场演唱会&#xff0c;其中鸟巢演唱会被认为…

工程技术SCI期刊,中科院三区,一投就中,国人友刊!

一、期刊名称 Industrial Management & Data Systems 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;工程技术 影响因子&#xff1a;5.5 中科院分区&#xff1a;3区 出版方式&#xff1a;订阅模式/开放出版 版面费&#xff1a;$4120 三、期刊征稿范…

500的项目研发成本2000?

上个月接了一个小程序的二开项目&#xff0c;功能不多就2个诉求&#xff1a;调整首页数据排序规则&#xff0c;帖子详情增加一个海报&#xff0c;报了一个我认为还比较合适的价格500。 当我拿到代码的那一刻有点小害怕&#xff0c;因为这个客户的之前合作过一次&#xff0c;项…

Chromium编译指南2024 Windows11篇-获取 Chromium 的源代码(五)

前言 在《Chromium编译指南2024&#xff08;四&#xff09;》中&#xff0c;我们完成了Git 的初始化配置。 现在&#xff0c;我们将进一步讨论如何获取 Chromium 的源代码&#xff0c;并准备构建所需的文件。 1. 获取Chromium的源代码 在合适的位置准备一个文件夹&#xff…

Python中使用嵌套for循环读取csv文件出现问题

如果我们在使用嵌套循环来读取 CSV 文件时遇到了问题&#xff0c;可以提供一些代码示例和出现的具体错误&#xff0c;这样我可以更好地帮助大家解决问题。不过&#xff0c;现在我可以给大家一个基本的示例&#xff0c;演示如何使用嵌套循环来读取 CSV 文件。 问题背景 我需要读…

spring bean生命周期全部过程

Spring Bean的生命周期包括以下全部过程&#xff1a; 实例化&#xff1a;在Spring容器启动时&#xff0c;根据配置文件或注解等信息创建Bean的实例。属性赋值&#xff1a;如果Bean有属性需要进行初始化&#xff0c;Spring容器会自动为这些属性进行赋值。自定义初始化方法&…

Tomcat端口占用解决方案

Windows操作系统 出现这种情况&#xff1a; Error was Port already in use :40001&#xff1b;nested exception is :java.net.BindException: Address already in use : JVM_Bind; 步骤1&#xff1a;按下winR键&#xff0c;输入cmd 步骤2&#xff1a;输入以下命令 netstat …

PS五官与服装PSD文件大全,男女证件照制作必备素材

一、素材描述 男女证件照服装和五官等PSD文件大全&#xff0c;制作证件照的必备素材合集&#xff0c;轻松制作高端大气的证件照。什么是DR5&#xff1f;DR5是Delicious Retouch 5的简称&#xff0c;这是一款非常优秀的PS人像磨皮美容插件&#xff0c;DR5的主要功能就是针对人像…

【七十九】【算法分析与设计】并查集模板!!!并查集的实现_牛客题霸_牛客网,【模板】并查集 - 洛谷,并查集代码!!!

并查集的实现_牛客题霸_牛客网 描述 给定一个没有重复值的整形数组arr&#xff0c;初始时认为arr中每一个数各自都是一个单独的集合。请设计一种叫UnionFind的结构&#xff0c;并提供以下两个操作。 boolean isSameSet(int a, int b): 查询a和b这两个数是否属于一个集合 void u…

Android 启动提示Android 正在升级...提示源码分析

正常情况下烧录的新机会有这个提示&#xff0c;因为系统启动时候要对系统APP做DexOpt优化&#xff0c;流程如下&#xff1a; 进入performBootDexOpt函数&#xff1a; 提示框代码如下&#xff1a; 而提示框的Tile和Msg如下&#xff1a; 打印Log&#xff1a; 觉得本文对…

炫酷Chrome:插件大礼包

Chrome浏览器以其强大的功能和丰富的扩展插件库而闻名。 其中&#xff0c;有些插件专为提升用户的浏览体验而设计&#xff0c;例如更换Chrome网页背景图、自定义鼠标点击样式&#xff0c;以及提供便捷的页面跳转工具等。 最近&#xff0c;有一款被称为“宝藏插件包”的工具引…

AI图书推荐:Zapier和AI融合来自动化业务流程

这本书《Zapier和AI融合来自动化业务流程》&#xff08;Automate It with Zapier and Generative AI&#xff09;由Kelly Goss撰写&#xff0c;这本书是为想要使用Zapier和AI集成功能来自动化重复性任务、提高生产力的微型、小型或中型企业的业务所有者、运营经理和团队准备的。…