当前位置: 首页 > news >正文

深入解析:【网络编程】套接字入门:网络字节序与套接字种类剖析

深入解析:【网络编程】套接字入门:网络字节序与套接字种类剖析


请添加图片描述


半桔:个人主页

个人专栏: 《Linux手册》《手撕面试算法》《C++从入门到入土》

有时候,白纸一张更能呈现无尽可能。 -《帕特森》-

文章目录

  • 一. 前言
  • 二. 套接字
  • 三. 网络字节序
  • 四. 套接字种类

一. 前言

在网络通信构建的数字世界里,套接字是程序叩响网络大门的密钥,网络字节序是数据跨平台流转的通用语言,而套接字种类 UDP 的高效灵活?就是则决定了通信的“战术风格”——是追求 TCP 的可靠稳行,还

本文将从这三个核心维度切入,拆解网络编程的底层逻辑:从套接字的创建与通信流程,到字节序转换的隐蔽陷阱,再到不同套接字类型的适用场景,逐步揭开网络通信的运行密码。无论你是初涉网络开发的学习者,还是希望深耕协议细节的开发者,这些基础命题的剖析,都将为你搭建起从理论到实践的桥梁,让网络编程的复杂原理变得清晰可触。

本文将分为三部分:

  1. 套接字;
  2. 网络字节序;
  3. 套接字类型。

二. 套接字

我们都知道数据在进行参数的时候要进行封装和解包,那么在接收方的传输层解包后他怎么知道交给上层的哪一个程序???

操作系统中的每一个应用都一个端口号Port来记录进程的唯一性,通过在报头中添加目的进程的端口号就可以让对方知道要将信息交付给哪一个程序。

IP使用来标识全网中唯一的一台主机的,而端口号用来标识一台主机上唯一的进程。
因此IP + Port就可以标定全网唯一的进程。这种定位进程的方式就称为套接字。、

在操作系统中PID也能定位唯一的进程呀,为什么不使用PID + IP来进行定位???

也行这样进行定位,但是为了将网络与系统进行解耦,利用新的端口号来标识进程。

在操作系统中一个哈希表,使用key-value的模式来将端口号与进程的task_struct结构体对象进行绑定。

三. 网络字节序

一个机器有大端,也有小端,两者存放数据的形式恰好相反,那么发送到网络中的数据形式是什么样的???

  • 错误的,根本看不懂;就是按照自己机器的数据存放方式进行发送,如果发送方是大端,接收方是小端,就会导致接收方解析出来的数据

能不能在报头中告诉对方自己是大端还是小端的???

不行,本来对方就不知道如何解析数据,而你在这些解析不出来的数据中告诉对方如何解析。

为了方便,TCP/IP规定,网络字节流中统一采用大端字节序,即低地址放高字节。

四. 套接字种类

在套接字编程中,根据通信范围和协议层次,主要可分为域间套接字网络套接字原始套接字三类,它们的应用场景和工作方式有显著区别:

原始套接字(Raw Socket)

以下是三种套接字应用时的结构体:分别对应原始套接字,网络套接字和域间套接字
![[套接字类型.png]]

其结构体字段如下:

struct sockaddr {
sa_family_t	sa_family;	/* address family, AF_xxx	*/
char		sa_data[14];	/* 14 bytes of protocol address	*/
};
struct sockaddr_in {
sa_family_t		sin_family;	/* Address family		*/
unsigned short int	sin_port;	/* Port number			*/
struct in_addr	sin_addr;	/* Internet address		*/
/* Pad to size of `struct sockaddr'. */
unsigned char		__pad[__SOCK_SIZE__ - sizeof(short int) -
sizeof(unsigned short int) - sizeof(struct in_addr)];
};
struct sockaddr_un {
sa_family_t sun_family;	/* AF_UNIX */
char sun_path[UNIX_PATH_MAX];	/* pathname */
};

以上三种套接字如果直接提供接口,就会出现3种不同但是类似的接口,因此为了方便在使用接口的时候统一传struct sockaddr,通过访问前两个字节来确定类型,进而使用不同类型的结构体进行操作。

http://www.hskmm.com/?act=detail&tid=21609

相关文章:

  • 地产行业,居然还有这样的开发商 - 智慧园区
  • Tita项目与绩效一体化管理:重构组织效能的数字化中枢
  • 实用指南:电子电气架构 --- 智能座舱域环境感知和人机交互系统
  • 强化学习(二十二)-MADDPG
  • GLM-4.6与DeepSeek-V3.2-Exp发布
  • 2025.9.30——1黄
  • 【半导体物理 | 笔记】第二章 半导体中杂质和缺陷能级
  • 基于内容可信空间的医疗行业机遇研究报告
  • v-show会导致重绘还是重排?
  • M3-Agent:看见、听见、记住与推理:具备长期记忆的多模态智能体
  • 20250930
  • 阿里云发布《AI 原生应用架构白皮书》
  • NVR接入录像回放平台EasyCVR智慧农田可视化视频监控方案
  • sql server 版本查询
  • Matlab dsp工具箱可以实现定点FFT的功能
  • MySQL悲观锁(排他锁)级别
  • Swagger 3.0 + Knife4j 入门到实战:Spring Boot API 文档搭建、注解详解与生产环境安装
  • 打破信息孤岛,构建统一视界:视频融合平台EasyCVR在智慧校园建设中的核心作用
  • Linux ssh/scp/sftp命令利用及免密登录配置
  • PySimpleGUI 中有哪些可以单独使用的函数?
  • Learning Continuous Image Representation with Local Implicit Image Function
  • Fastadmin开发两个APP端,接口token验证
  • 网易伏羲受邀亮相2025云栖大会,展示AI领域前沿创新成果
  • 2025 年人工智能培训机构最新推荐榜单:前五合规运营与产业适配能力深度解析及选择指南大模型培训/智能体培训/Agent培训机构推荐
  • 9年了 - ukyo-
  • js 获取下一个月时间和下一年的时间
  • 【Rust GUI开发入门】编写一个本地音乐播放器(5. 制作音乐列表组件) - Jordan
  • 【Nordic】nRF9151的SLM例程常用AT指令说明
  • sql server经典语句「转」
  • Codeforces 2149G Buratsuta 3 题解 [ 蓝 ] [ 摩尔投票 ] [ 线段树 ] [ 随机化 ] [ 主席树 ] [ 根号分治 ]