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"     32Bytes

ntohl()--"Network to Host Long int"     32Bytes

htons()--"Host to Network Short int"    16Bytes

ntohs()--"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码/或二进制的整数

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

子查询之一(单行子查询, 多行子查询)

1. 子查询 子查询是指一个查询语句嵌套在另一个查询语句内部的查询.这个特性在MySQL4.1开始引入. SQL中子查询的使用大大增强了SELECT查询的能力.因为很多时候查询需要从结果集中获取数据&#xff0c;或者需要从同一个表中先计算得到一个数据结果&#xff0c;然后与这个数据结…

在Windows中创建和管理组策略管理模板的中央存储

本文参考于&#xff1a; 创建和管理中央存储 - Windows Client | Microsoft Learn 管理模板文件存储 Windows使用中央存储来存储管理模板&#xff0c;与组策略不同&#xff0c;ADM文件夹并不是通过组策略对象&#xff08;GPO&#xff09;来创建的。由于Windows版本与Windows…

OpenAI 发布 AI 生成图片检测器;Meta 推出 AI 广告创意工具;Google 正式发布 Pixel 8a,主打 AI

OpenAI 发布 AI 生成图片检测器 OpenAI 昨日官宣推出专用的 AI 监测工具&#xff0c;用于监测图片是否由其旗下 AI 图片生成工具 DALL-E 生成&#xff0c;准确率高达 98.8%。 不过该公司表示&#xff0c;这个检测工具并非旨在检测 Midjourney 和 Stability 等其他流行生成器生…

Java基于Spring Boot框架毕业生实习与就业管理系统的设计与实现(附源码,说明文档)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

vue+springboot实现excel批量数据的导入导出

①后端配置端口&#xff1a;修改UserController UserController&#xff1a; package com.example.springboot.controller;import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.…

IPFoxy Tips:什么是静态住宅IP?静态ISP代理指南

静态住宅代理&#xff08;也称为静态ISP代理&#xff09;是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务&#xff1f;下面我具体分享。 一、什么是静态住宅代理&#xff1f; 首先&#xff0c;我…

Pentaho Community Edition 下载安装和运行

1 访问网站 https://www.hitachivantara.com/pentaho/pentaho-plus-platform/data-integration-analytics/pentaho-community-edition.html &#xff0c;点击 Download Now 。 2 选中&#xff0c;然后点击 Proceed to Download。 3 页面往下滑&#xff0c;选择合适的版本&…

关于线程池,它的扩展问题你知道吗?(自己总结)

专门想一下为什么线程池不用Excutors&#xff0c;之前的印象是错的&#xff0c;居然还拿来面试里讲&#xff0c;惭愧&#xff0c;这里暂时整理俩小问题&#xff0c;其他的后续可能会更新。。 线程池是创建的越大越好嘛 #线程池创建的越大越好吗 Tip&#xff1a;2024-04-10 更…

YOLOv5-7.0改进(三)添加损失函数EIoU、AlphaIoU、SIoU、WIoU、MPDIoU、NWD

前言 损失函数的改进一直是涨点的重要技巧&#xff0c;本篇博客将使用六个不同损失函数对算法进行改进&#xff0c;并绘制出改进结果对比图~ 往期回顾 YOLOv5-7.0改进&#xff08;一&#xff09;MobileNetv3替换主干网络 YOLOv5-7.0改进&#xff08;二&#xff09;BiFPN替换…

SRC上分秘诀+实战挖掘+挖洞技巧+新手上路+详细讲解

SRC马上到来 可能有些好兄弟们还没有头绪 只会做一些靶场 并没有什么实战经验 所以这篇文章给大家分享一下我挖洞2个月的经验分享 适合新手上路 如何找站&#xff1f; 谷歌搜索 谷歌搜索 谷歌搜索 SQL注入XSS所有漏洞 inurl:.php?idxx 公司inurl:.asp?idxx 公司inurl:.jsp?…

【每日刷题】Day35

【每日刷题】Day35 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 844. 比较含退格的字符串 - 力扣&#xff08;LeetCode&#xff09; 2. 2487. 从链表中移除节点 - 力…

C++:编程界的王者,引领未来的创新之路

在编程语言的浩瀚星空中&#xff0c;C犹如一颗耀眼的恒星&#xff0c;以其卓越的性能、深厚的底蕴和广泛的应用领域&#xff0c;持续引领着编程界的发展。它不仅在当下拥有无可替代的地位&#xff0c;更在未来展现出无限的潜力和可能性。 一、C&#xff1a;编程界的王者风范 …

[Linux深度学习笔记5.9]

5.9笔记 DNS: 软硬链接&#xff1a; 软链接&#xff1a; 软链接&#xff1a;ln -s /源文件 /目标位置/链接名称》创建软链接1.既可以对目录使用&#xff0c;也可以对文件使用2.删除源文件&#xff0c;软链接不可用3.软链接可以跨文件系统使用4.源文件和软链接的inode号不同5.…

【springboot基础】如何搭建一个web项目?

正在学习springboot&#xff0c;还是小白&#xff0c;今天分享一下如何搭建一个简单的springboot的web项目&#xff0c;只要写一个类就能实现最基础的前后端交互&#xff0c;实现web版helloworld &#xff0c;哈哈&#xff0c;虽然十分简陋&#xff0c;但也希望对你理解web运作…

MGRE 实验

需求&#xff1a;1、R2为ISP&#xff0c;其上只能配置IP地址。 2、R1-R2之间为HDLC封装 3、R2-R3之间为ppp封装&#xff0c;pap认证&#xff0c;R2为主认证方。 4、R2-R4之间为ppp封装&#xff0c;chap认证&#xff0c;R2为主认证方。 5、R1、R2、R3构建MGRE环境&#xff0…

C++语言·string类

1. 为什么有string类 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数(strcpy,strcat)&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP(Object Oriented Programming面向对…

ARM(4)缓存一致性

目录 一、缓存一致性问题 二、一致性实现方案 2.1 目录一致性协议 2.2 嗅探一致性协议 三、CHI协议 3.1 cache state 3.2 snoop维护一致性 四、其他一致性协议 4.1 MSI协议 4.2 MESI 协议 4.3 MOESI协议 本文介绍以下内容&#xff1a; 缓存一致性问题一致性实现方案…

通过 Java 操作 redis -- zset 有序集合基本命令

目录 使用命令 zadd&#xff0c;zrange 使用命令 zcard 使用命令 zrem 使用命令 zscore 使用命令 zrank 关于 redis zset 有序集合类型的相关命令推荐看Redis - Zset 有序集合 要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Jav…

景源畅信数字:抖音小店的入住门槛大不大?

近年来&#xff0c;随着短视频平台的崛起&#xff0c;抖音小店逐渐成为了众多商家和创业者关注的焦点。那么&#xff0c;抖音小店的入住门槛究竟大不大呢?本文将从四个方面对这一问题进行详细阐述。 一、注册流程 抖音小店的注册流程相对简单&#xff0c;只需按照官方指引完成…

渲染管线中光照的计算

文章目录 渲染管线中光照的计算前言法向量朗伯余弦定律漫反射环境光照镜面光照菲涅尔效应 表面粗糙度光照模型平行光源点光源衰减 聚光灯 渲染管线中光照的计算 前言 首先我们来看一下同一个模型在有光与无光下的区别&#xff1a; 无光&#xff1a; 有光 很明显的感知就是…