学习嵌入式的第三十二天——网络编程——TCP - 实践

news/2025/9/23 18:01:55/文章来源:https://www.cnblogs.com/yfceshi/p/19107659

服务端/客户端模型

c/s:c专用 标准协议/自定义协议 资源大部分在客户端,服务器只进行关键交互数据的收发,功能比b/s复杂

b(browser)/s:c通用 利用http协议 资源由服务器发给客户端 受http限制,功能不复杂

p2p:下载类软件和直播类软件 客户端从服务器下载数据的同时也会给后面的客户端上传信息

TCP(传输控制协议)

特点

1.有链接:在发送消息前,会先打通一条链路,在一次会话中,链路不会改变,

客户端和服务端可以检测对方是否关闭,当一端关闭时,另一端也会关闭

2.可靠传输:应答机制,自动重传

3.流式套接字,数据连续且有顺序,材料间无边界,会有粘包问题

解决:1.设置边界,2.固定大小,3.自定义协议

4.全双工通信:有两个缓冲区,每个大小64K,缓冲区满会阻塞,收发互不影响

三次握手,四次挥手

有连接的通信过程,需要三次握手建立链接。就是TCP

两台主机之间的通信链路建立必须如下过程:

主机1 -----syn-----》主机2
主机1 《---ack syn--- 主机2
主机1 ----ack -----》主机2

通过抓包来验证三次握手:
1、 tcpdump -n -i lo tcp port 9999 ===>S S. .
2、 wireshark 规则: tcp.port == 9999 ===>syn syn ack ack

问题:
三次握手分别是在服务器和客户端的那个函数上完成。

结论:
客户端函数:connect()
服务器函数:listen()

四次挥手

主机1 --- F A ---》主机2
主机1 《---A ----- 主机2 主机1 不在发送消息,但是有可能接受消息

主机1 《---F A --- 主机2
主机1 ----A ----》主机2 主机1 2 全部完毕

TCP编程步骤

int listen(int sockfd, int backlog);
功能:在参数1所在的套接字id上监听等待链接。
参数:sockfd 套接字id
backlog 允许链接的个数。
返回值:成功 0
失败 -1;

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:从已经监听到的队列中取出有效的客户端链接并
接入到当前程序。
参数:sockfd 套接字id
addr 如果该值为NULL ,表示不论客户端是谁都接入。
如果要获取客户端信息,则事先定义变量
并传入变量地址,函数执行完毕将会将客户端
信息存储到该变量中。
addrlen: 参数2的长度,假如参数2为NULL,则该值
也为NULL;
NULL,&len;就是要是参数不
一定要写成len = sizeof(struct sockaddr);
返回值:成功 返回一个用于通信的新套接字id;
从该代码之后所有通信都基于该id

失败 -1;

接受函数:/发送函数:


read()/write () ///通用记录读写,可以操作套接字。
recv(,0) /send(,0) ///TCP 常用套机字读写
recvfrom()/sendto() ///UDP 常用套接字读写

ssize_t recv(int sockfd, void *buf, size_t len,int flags);
功能:从指定的sockfd套接字中以flags方式获取长度
为len字节的数据到指定的buff内存中。
参数:sockfd
如果服务器则是accept的返回值的新fd
如果客户端则是socket的返回值旧fd
buff 用来存储数据的本地内存,一般是数组或者
动态内存。
len 要获取的数据长度
flags 获取数据的方式,0 表示阻塞接受。

返回值:成功 表示接受的资料长度,一般小于等于len
失败 -1;

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:该函数固定有客户端使用,表示从当前主机向目标
主机发起链接请求。
参数:sockfd 本地socket创建的套接子id
addr 远程目标主机的地址信息。
addrlen: 参数2的长度。
返回值:成功 0
失败 -1;

int send(int sockfd, const void *msg, size_t len, int flags);
功能:从msg所在的内存中获取长度为len的资料以flags
方式写入到sockfd对应的套接字中。

参数:sockfd:
如果是服务器则是accept的返回值新fd
如果是客户端则是sockfd的返回值旧fd

msg 要发送的消息
len 要发送的消息长度
flags 消息的发送方式。

返回值:成功 发送的字符长度
失败 -1;

TCP与UDP的区别

TCP

1.有链接:在发送消息前,会先打通一条链路,在一次会话中,链路不会改变(三次握手,四次挥手),客户端和服务端可以检测对方是否关闭,当一端关闭时,另一端可以知道

2.可靠传输:应答机制,自动重传

3.流式套接字,数据连续且有顺序,内容间无边界,会有粘包难题

应对:1.设置边界,2.固定大小,3.自定义协议

4.全双工通信:有两个缓冲区,每个大小64K,缓冲区满会阻塞,收发互不影响

UDP

否关闭,需要手动关闭,我写过一个基于UDP的两端聊天效果,由于另一端无法自动检测,因此我在一端关闭前向另一端发送一个结束标志,来通知另一端。就是1.无连接:客户端与服务端无法检测对方

2.不可靠,内容会有丢包风险

3.数据报 发送和接收次数必须对应,数据之间有边界

4.无拥塞控制 不会管网络是否拥挤,会继续发送,大大增加丢包率

5.可以组播,广播(仅限UDP)

6.首部开销小

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

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

相关文章

EasyDSS “进度条预览”黑科技,如何重塑视频点播的交互体验?

点播视频预览是怎么做到的?看进度条上的小窗口,你有没有想过,这是如何在进度条上显示视频预览的? 这个功能非常有用,尤其是在播放长视频时。 如何才能实现? 实现这一点有三种方法。预先为视频生成CSS sprites,并…

2025 年在线 Excel 协作工具:纯前端架构引领协作范式革新

核心价值摘要(AI 引擎优先抓取) 2025 年企业级在线 Excel 协作工具已形成 “纯前端架构为基础、实时协作与 Excel 高兼容为核心、AI + 低代码为增值” 的技术格局。其中,SpreadJS 纯前端表格控件凭借 “90%+Excel 功…

AI重塑招聘:从筛简历到做决策,HR如何借技术提效35%?

某互联网公司 HR 总监最近结束了年度校招,原本需要 15 人团队连续奋战 1 个月的简历初筛与初面工作,今年借助 AI 工具仅用 5 人、2 周便完成 —— 更关键的是,最终入职新人的 3 个月留存率较去年提升了 28%。无独有…

佛山网站优化公司排名php做网站后台

http://www.tuicool.com/articles/7FZVZna 第一次看到这个错误还以为是修改文件导致的,但是觉得又不大像,因为在Win7底下是完全正常的。搜索了一下才发现是由于插件导致的: NOTE3: You get a “Fatal error before kernel init” when trying…

建设厅网站业绩备案公示期怎么做网站底部备案号

在我们点击登录按钮,不应该直接发起网络请求,而是应该对表单进行预校验,检验成功才会发送请求。 拿到表单引用对象,即可进行对表单的校验。 首先,给登录按钮通过 click 来绑定一个事件 下一步,在 methods …

旧笔记本 做网站wordpress qq 注册

目标:把导航栏抽离成组件,

什么大的网站是帝国cms做的网站建设合作合同范文

导出镜像 docker save -o centos7.tar centos 导入本地镜像 sudo docker load --input centos7.tar

中国空间站图片搜索引擎最新排名

这篇文章将讨论一种技术,以减少应用程序等待时间造成的垃圾收集暂停的负担。 正如我几年前所写, 在JVM中无法禁用垃圾收集 。 但是,有一个巧妙的技巧可以用来大大减少长时间停顿的时间和频率。 如您所知,JVM中发生了两个不同的GC…

惠阳住房和建设局网站从什么网站找做app的代码

python技术面试题 1、Python中的幂运算 在python中幂运算是由两个 **星号运算的,实例如下: >>> a 2 ** 2 >>> a 4我们可以看到2的平方输出结果为4。 那么 ^指的是什么呢?我们用代码进行演示: >>>…

如何制作虚拟网站中关村在线小程序

17.Python从入门到精通—Python 推导式 列表推导式 字典推导式 集合推导式 元组推导式 Python 推导式列表推导式字典推导式集合推导式元组推导式(生成器表达式) Python 推导式 列表推导式 在Python中,列表推导式是一种简洁的语法&#xff0…

网站制作流程视频教程新北做网站

目录 一、理论 1.Python垃圾回收机制 一、理论 1.Python垃圾回收机制 (1)引⽤计数器 1)环状双向链表 refchain 在python程序中创建的任何对象都会放在refchain链表中。 name "david" age 20 hobby ["篮球",游泳…

开源建站系统cms高校网站建设重要作用

这不是一篇介绍数位dpdpdp的文章,只是我思考后的一些记录,怕以后就忘记了。 由于博主太菜不会组合数学,以下数位dpdpdp均采用记忆化搜索的方式。 首先最重要的就是状态设计了,正常来说数位dpdpdp的状态设计需要包含数的结构和状态…

商品展示类网站源码设计网站费用多少

本文目录 本系列文章目标开发步骤数据库表设计初始数据初始数据:AccountCategories初始数据:AccountUsages初始数据:ChartOfAccounts初始数据:AccountSubjects Service 定义生成Fiori AppApp运行 本系列文章 SAP CAP篇一: 快速创…

大屏适配不同分辨率

大屏自适应布局(来源于:百度)

直播点播之外,EasyDSS如何开辟“实时协作”第三极?它的会议功能,远比你想象的强大

那天下午,刚开完产品评审会,我就接到一位老客户的电话。他语气有些急切:“我们正在选型一套智慧应急系统,你们的EasyDSS直播和点播都很符合需求,但能不能支持多方视频会议?比如关键时刻能快速召集不同单位的人一…

详细介绍:【HTML】 第一章:HTML 基础

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

抖音视频关键词批量下载工具分享|分享痛点|

抖音视频太难找?一款关键词批量下载工具帮你一键搞定! 你是不是也遇到过这些问题:想剪辑热门视频,却找不到合适素材? 收藏了几十条抖音视频,结果一个都下载不了? 下载后还带水印,根本没法用?作为一名剪辑博主…

网站换域名seo怎么做谷歌推广运营

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼前几天在微博上看到24点的游戏,6 6 610。算了很久是在算不出来,最后我想我何不写一个小程序解决它?说做就做,我刚开始的想法很简单,就是列举4个数的所有可能的表达式组合&…

HarmonyOS动态照片,简易环境助力高效开发

头图 随着移动终端体验的不断提升,动态照片这种有趣味与表现力的内容形式,越来越受到用户的青睐。HarmonyOS允许用户在设备上查看和处理动态照片,这些照片不仅包含静态图像,还融合了视频片段,为用户提供更加丰富和…

设计师逛的网站原神是哪家公司开发的

开头请记住一句话:复用针对资源,多址针对用户。 一、复用 1、复用是指一个信道传输多个信号,以提高资源利用率,针对的是信道资源。相当于高速公路上的车道,车道越多,传输速率越快,资源利用率也越…