Linux系统编程(15)send/recv函数

news2024/11/14 11:03:09

一、send/recv

send 和 recv 是在网络编程中常用的两个函数,用于在套接字(socket)之间发送和接收数据。

1.send 函数

用于将数据发送到连接的套接字。

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  • sockfd:要发送数据的套接字描述符。
  • buf:指向要发送数据的缓冲区的指针。
  • len:要发送的数据字节数。
  • flags:发送的标志,通常可以设置为 0。
  • 返回值:成功时返回实际发送的字节数,失败时返回 -1。

2. recv 函数

用于接收来自连接的套接字的数据。

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  • sockfd:要接收数据的套接字描述符。
  • buf:指向用来存储接收到的数据的缓冲区的指针。
  • len:要读取的最大字节数。
  • flags:接收的标志,通常可以设置为 0。
  • 返回值:成功时返回实际接收到的字节数。如果对方关闭了连接,返回 0;失败时返回 -1。

 注意:

  1. 阻塞与非阻塞send 和 recv 默认为阻塞模式,但可以将套接字设置为非阻塞模式。
  2. 数据完整性send 和 recv 并不保证会发送或接收完整的数据,需根据返回值进行处理,可能需要在循环中调用这些函数以确保完整数据的发送和接收。

二、粘包

粘包问题是网络编程中常遇到的一个问题,尤其是在使用 TCP 协议的情况下。由于 TCP 是一种面向字节流的协议,它不会维护消息边界,可能会导致多个独立发送的数据包在接收方被粘连在一起。

1. 粘包的定义
  • 粘包:指的是发送方连续发送了多个数据包,接收方在读取数据时无法区分这些独立的数据包,导致多个数据包粘在一起,形成一个大的数据块。
  • 拆包:是指接收方在读取数据时,发现一个完整的数据包被拆分为多个部分,导致难以正确解析。
2. 粘包和拆包的原因

粘包和拆包问题主要由以下几个因素引起:

  • TCP 是面向字节流的协议:TCP 接收的数据是一个连续的字节流,没有消息边界的概念。
  • 网络延迟:网络的延迟可能会导致多个小的数据包在网络中被合并成一个大包。
  • 发送频率:如果发送方频繁地发送小数据包,接收方可能会在缓冲区中接收到这些小包的组合。

3. 解决粘包问题的方法

由于粘包和拆包问题是 TCP 通信中的常见问题,因此需要通过以下方法加以解决:

a. 定长消息

每个数据包都有固定的长度,发送和接收方都知道这一长度。

  • 优点:简单明了,不需要额外的逻辑;
  • 缺点:不灵活,不能处理可变长度的数据。
b. 使用分隔符

在数据包之间使用特定的字符(如换行符、逗号或其他不可出现的字符)来分隔消息。

  • 示例:发送内容为 "Hello\nWorld\n",接收方通过换行符来判断消息的结束。
  • 优点:实现简单;
  • 缺点:需要保证分隔符不在数据内容中。

三、抓包

        抓包是指通过特定工具捕获网络中传输的数据包,以便分析其内容、结构和传输状态。抓包可以帮助开发者和网络管理员诊断网络问题、调试应用程序、分析协议等。

常用的抓包软件:

wireshark

TCP报文首部的组成结构

 
1. TCP 段的组成

一个 TCP 段的结构一般可以划分为以下部分:

  1. 源端口(Source Port):16 位,表示发送方的端口号。
  2. 目的端口(Destination Port):16 位,表示接收方的端口号。
  3. 序列号(Sequence Number):32 位,用于标识字节流中的字节位置,用于确保数据的顺序。
  4. 确认号(Acknowledgment Number):32 位,表示期望接收的下一个字节的序列号,用于实现可靠性。
  5. 数据偏移(Data Offset):4 位,指示 TCP 头部的长度(以 32 位字为单位)。
  6. 保留位(Reserved):6 位,保留供将来使用。
  7. 控制位(Flags)(6 位):包括以下标志位:
    • URG(紧急标志)
    • ACK(确认标志)
    • PSH(推送标志)
    • RST(重置标志)
    • SYN(同步标志)
    • FIN(结束标志)
  8. 窗口大小(Window Size):16 位,表示接收方的缓冲区大小。
  9. 校验和(Checksum):16 位,校验 TCP 段的完整性。
  10. 紧急指针(Urgent Pointer):16 位,仅在 URG 标志为 1 时有效,指示紧急数据的位置。
  11. 选项(Options):可变长度,可能包含窗口扩大、时间戳等选项。
  12. 填充(Padding):确保 TCP 头部的长度是 32 位的倍数。
  13. 数据(Data):可变长度,包含应用层传输的数据。
2. TCP 标志位的作用
  • URG(紧急标志)

    • 表示紧急数据的存在。若设置为 1,接收方会优先处理紧急数据。
  • ACK(确认标志)

    • 表示确认号有效。每当接收到数据时,都会发送带有 ACK 标志的包,以确认已收到的数据。
  • PSH(推送标志)

    • 表示接收方应立即将数据推送到应用层,而不是等待缓冲区满。适用于需要实时处理的数据。
  • RST(重置标志)

    • 用于重置连接。当一方希望强制关闭连接时,会发送带有 RST 标志的包。
  • SYN(同步标志)

    • 用于建立连接。在 TCP 三次握手过程中,客户端和服务器通过发送带有 SYN 标志的包来同步序列号。
  • FIN(结束标志)

    • 用于结束连接。当一方完成数据传输时,会发送带有 FIN 标志的包,表示希望关闭连接。

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

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

相关文章

掌握语义内核(Semantic Kernel):如何使用Memories增强人工智能应用

随着人工智能领域的不断发展,语义内核(Semantic Kernel)的概念应运而生,为我们处理和理解庞大的数据集提供了新的视角。今天,我们将聚焦于语义内核中的一个核心概念——Memories,它是如何使我们的数据查询更…

跨入数字新时代:探寻数字媒体技术的魅力与前景

在当今数字化的时代,数字媒体技术如同一股汹涌的浪潮,席卷着我们生活的方方面面,展现出无与伦比的魅力和广阔无垠的前景。 数字媒体技术的魅力首先体现在它为信息传播带来的革命性变化。以往,我们通过书本、报纸、电视等传统媒介获…

SpringBoot教程(二十五) | SpringBoot整合Sharding-JDBC分库分表

SpringBoot整合Sharding-JDBC分库分表 前言1. 什么是Sharding?2. 什么是Sharding-JDBC? 所需的maven依赖注意点(关于shardingsphere的配置情况)实操一:如何水平分表1. 步骤说明2. 创建数据库和表3.配置application.pro…

java反序列化之CommonCollections1利⽤链的学习

一、源起 1、代码示例 既然学习cc1链&#xff0c;那么总要先了解下cc1链能造成任意代码执行的原因&#xff0c;这里引用P神的代码来进行讲解&#xff1a; ps:环境使用&#xff1a; CommonsCollections < 3.2.1java < 8u71 import org.apache.commons.collections.Trans…

【Python机器学习】NLP分词——利用分词器构建词汇表(一)

在NLP中&#xff0c;分词&#xff08;也称切词&#xff09;是一种特殊的文档切分过程。而文档切分能够将文本切分成更小的文本块或片段&#xff0c;其中含有更集中的信息内容。文档切分可以是将文本分成段落&#xff0c;将段落分成句子&#xff0c;将句子分成短语&#xff0c;或…

C语言学习——文件

目录 十三、文件 13.1C文件概述 13.2文件类型指针 13.3文件的打开与关闭 文件的打开&#xff08;fopen函数&#xff09; 文件的关闭&#xff08;fclose函数&#xff09; 13.4文件的读写 fputc函数和fgetc函数&#xff08;putc函数和getc函数&#xff09; fread函数和fw…

在亚马逊云科技上通过LangChain ReAct Agent开发金融多模态数据AI分析中台

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何在亚马逊云科技机器学习托…

简易版营业厅宽带系统

TOC ssm018简易版营业厅宽带系统jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管…

音频Transformer架构

第3单元:音频Transformer架构 本课程中,我们主要关注Transformer模型以及它们如何应用于音频任务。虽然您不需要了解这些模型的内部细节,但了解使它们工作的主要概念很有用,因此我们在本小节中回顾一下关于Transformer的知识。有关transformer的深入了解,请查看我们的NLP…

互联网的发展是否加剧了数字鸿沟?

有人问&#xff1a;互联网的发展是否加剧了数字鸿沟。 互联网的发展确实在某种程度上加剧了数字鸿沟。虽然互联网的普及为全球范围内的人们提供了前所未有的访问信息、教育资源和经济机会的机会&#xff0c;但其发展也凸显并放大了不同群体之间的差距&#xff0c;比如以下几个…

dokcer 安装 redis(单机版)

准备工作 拉取redis镜像 docker pull redis 通过docker-compose 安装redis 很方便、很简单 先安装docker&#xff0c;参考我这个安装示例进行安装 https://blog.csdn.net/qq_33192671/article/details/13714973 然后安装docker-compose&#xff0c;要是拉取docker-compose无…

【在Linux世界中追寻伟大的One Piece】IO基础

目录 1 -> 回顾 1.1 -> 回顾C文件接口 1.2 -> 总结 2 -> 系统文件I/O 3 -> 接口介绍 3.1 -> open 3.2 -> open函数返回值 3.3 -> 文件描述符fd 4 -> 0 & 1 & 2 5 -> 文件描述符的分配规则 6 -> 重定向 7 -> 使用dup2系…

跨链互通:Web3如何实现多链互操作性

随着区块链技术的发展&#xff0c;各类区块链网络不断涌现&#xff0c;然而&#xff0c;不同链之间的互操作性问题成为了一个重要挑战。跨链互通&#xff08;Cross-chain Interoperability&#xff09;技术正是为了解决这一问题&#xff0c;旨在打破各区块链网络间的壁垒&#…

恒创科技:如何管理和减少Windows服务器 CPU 负载?

CPU 负载是衡量网络服务器或计算机中央处理器 (CPU) 在任意给定时间内处理工作量的指标。它通常表示 CPU 正在执行或排队等待处理的进程数。 如何读取和管理CPU负载&#xff1a; 对于 Windows 系统 Windows 本身不支持“top”和“ps”命令&#xff0c;而类 Unix 系统则支持。不…

Xinstall助力App运营,邀请码自动识别,效率翻倍!

在App推广和运营的道路上&#xff0c;邀请码一直是一个让人又爱又恨的存在。它能够帮助我们追踪用户来源&#xff0c;衡量推广效果&#xff0c;但同时&#xff0c;繁琐的填写步骤也让许多潜在用户望而却步。然而&#xff0c;随着Xinstall的出现&#xff0c;这一切都将迎来颠覆性…

Promise学习之同步与异步

目录 前言 一、同步与异步 (一) 同步 (二) 异步 二、总结 (一) 同步 (二) 异步 前言 Java有多线程&#xff0c;前端有同步与异步&#xff0c;异步操作可以优化用户体验、提高性能与响应、处理并发与并行任务等等&#xff0c;异步操作有发送Ajax请求、读文件等&#xff0…

简明的Arthas故障排查实践

写在文章开头 Arthas是一款强大的开源Java诊断程序,它可以非常方便的启动并以界面式的方式和Java程序进行交互,支持监控程序的内存使用情况、线程信息、gc情况、甚至可以反编译并修改现上代码等。所以它成为笔者进行线上问题排查的重要手段,而本文将从实际使用的角度介绍一下…

我带着我的未来回来了!

&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d; &#x1f947;博主昵称&#xff1a;小菜元 &#x1f35f;博客主页…

第九周:机器学习笔记

第九周机器学习周报 摘要Abstract机器学习——Spatial Transformer1.1 How to transform an image/feature map?&#xff08;怎么做&#xff09;1.2 Interpolation&#xff08;插值&#xff09;1.3 spatial Transformer的应用 Pytorch学习1. 线性层2. 其他层的介绍3. 搭建小实…

Leetcode 237.19.83.82 删除链表重复结点 C++实现

Leetcode 237. 删除链表中的节点 问题&#xff1a;有一个单链表的head&#xff0c;我们想删除它其中的一个节点node。给你一个需要删除的节点 node 。你将 无法访问 第一个节点head。链表的所有值都是唯一的&#xff0c;并且保证给定的节点 node不是链表中的最后一个节点。删除…