Linux socket编程(1):套接字、字节序和地址结构体

套接字(socket)是一种使用标准Unix文件描述符与其他程序进行通信的方式,它在实际的应用中都十分常用。所以从这一篇文章开始,我将详细介绍一下Linux环境下的socket的用法。本篇文章将介绍套接字、字节序和地址结构体的相关知识。

文章目录

  • 1 什么是套接字
  • 2 字节序
  • 3 地址结构体

1 什么是套接字

计算机网络由多个层组成,每个网络层提供关于该层数据的不同限制。而套接字的本意是提供一种进程间通信的方法,使得在相同或不同主机上的进程能够以相同的规范进行双向的信息传送。如下图所示,套接字接口提供了对网络下层(1-4层)的统一API,并能套接字应用程序中实现上层(5-7层和应用格式)功能。
在这里插入图片描述

套接字是一种通用的编程接口,可以用于与不同类型的网络协议进行交互,不仅仅限于IP协议,还有UDP、ICMP等。在实际应用中,套接字应用程序通常会依赖于IP协议来实现网络通信。在传输层,套接字支持两种特定的协议:TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)。其中,TCP是面向连接、可靠、有序的流协议,而UDP是无连接、不可靠、自我界定的数据报协议。

在Linux中,Layer2-Layer4已经由内核实现,所以套接字可以看做是内核提供的给用户使用的网络协议栈的编程接口。

在这里插入图片描述

2 字节序

端口号和IP地址由多字节数据类型表示,它们被放置在数据包中,用于路由和多路复用。端口号占据2个字节,IPv4地址占据4个字节,但在不同架构之间传输多字节数据类型时会出现问题。

大端(Big-Endian)和小端(Little-Endian)是两种不同的字节序方式,用于表示多字节数据类型(如整数、浮点数)在计算机内存中的存储方式。

  • 大端字节序:MSB(最高有效位)位于地址最低的内存单元
  • 大端字节序:LSB(最低有效位)位于地址最低的内存单元

如下图所示,一个64位的值0x1122334455667788,在小端机器的内存中为0x8877665544332211,而在大端机器的内存中为0x1122334455667788。

在这里插入图片描述

如下图所示,可以通过程序来判断计算机的字节序:
在这里插入图片描述

在网络协议中,使用的是大端字节序,而大部分的主机使用的是小端字节序。所以,在Socket编程中提供了下面的函数来更改IP和端口号的字节序:

1.转换端口号(16位的整数)
Host->Network:主机字节序转网络字节序
unit16_t htons(uint16_t hostportnumber)
Network->Host:网络字节序转主机字节序
unit16_t ntohs(uint16_t netportnumber)

2.转换IPV4地址(32位的整数)
Host->Network
unit32_t htonl(uint32_t hostportnumber)
Network->Host
Unit32_t ntohl(uint32_t netportnumber)

3 地址结构体

connect()accept()bind()等套接字函数需要使用明确定义的地址结构来保存IP地址信息、端口号和协议类型。我们使用套接字来编写使用不同协议的网络应用程序,比如我们可以使用IPV4、IPV6、Unix等。问题在于:每种不同的协议都使用不同的地址结构来保存其寻址信息。

我们有存在一个通用的地址结构:struct sockaddr,在传递给这些套接字函数时,必须将您特定于协议的地址结构强制转换为通用的地址结构。

特定于协议的地址结构通常以sockaddr_开头,并以取决于该协议的后缀结尾。如下:

  1. struct sockaddr_in:
    • sockaddr_in 结构用于表示IPv4地址,通常称为"Internet地址"。它包含 IP 地址、端口号和协议族信息。这是在IPv4网络编程中最常使用的结构。
  2. struct sockaddr_in6:
    • sockaddr_in6 结构用于表示IPv6地址,与 sockaddr_in 类似,但适用于IPv6网络编程。它包含IPv6地址、端口号和协议族信息。
  3. struct sockaddr_un:
    • sockaddr_un 结构用于表示本地Unix套接字地址。Unix域套接字是用于本地通信的一种方式,而不是通过网络进行通信。它包含套接字文件的路径信息。
  4. struct sockaddr_dl:
    • sockaddr_dl 结构用于表示数据链路层地址,通常在底层网络编程中使用。这包括硬件地址,如MAC地址。这通常用于需要直接访问底层网络的应用程序。

本篇文章仅介绍IP4地址结构:struct sockaddr_in,来看一下它的结构体成员:

struct sockaddr_in {
    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */
};

/* Internet address */
struct in_addr {
	uint32_t       s_addr;     /* address in network byte order */
};
  • sin_family:地址结构的类型,在这里固定设置为 AF_INET,表示这是一个IPv4地址结构
  • sin_port:端口号
  • struct in_addr sin_addr:IPv4地址信息的结构体,该结构体中使用s_addr存储32位的IPv4地址

我们平时使用的地址都是192.168.1.1这种类型的,如果要转换为s_addr类型的整数,我们可以使用inet_addrinet_aton将点分十进制字符串表示的IPv4地址转换为网络字节顺序的32位整数。

  • inet_addr已经过时了,建议使用inet_aton ,因为它可以提供更多的错误处理信息

反过来,我们可以使用inet_ntoa()将32位的网络字节顺序的整数表示的IPv4地址转换为点分十进制字符串。

在这里插入图片描述

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

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

相关文章

使用Python分析时序数据集中的缺失数据

大家好,时间序列数据几乎每秒都会从多种来源收集,因此经常会出现一些数据质量问题,其中之一是缺失数据。 在序列数据的背景下,缺失信息可能由多种原因引起,包括采集系统的错误(例如传感器故障)…

Day28力扣打卡

打卡记录 给小朋友们分糖果 II(容斥原理) 链接 大佬的题解 def c2(n: int) -> int:return n * (n - 1) // 2 if n > 1 else 0class Solution:def distributeCandies(self, n: int, limit: int) -> int:return c2(n 2) - 3 * c2(n - limit …

【Opencv】cv::dnn::NMSBoxes()函数详解

本文通过原理和示例对cv::dnn::NMSBoxes()进行解读,帮助大家理解和使用。 原理 cv::dnn::NMSBoxes是OpenCV库中的一个函数,用于在目标检测中处理多个预测框。在目标检测中,模型可能会为同一个物体生成多个预测框&…

Docker的本地镜像发布到阿里云或者私有库步骤

学习笔记来源Docker 本地镜像发布到阿里云 1、生成镜像(使用commit命令) 创建阿里云仓库镜像 阿里云开发者平台 https://promotion.aliyun.com/ntms/act/kubernetes.html 创建仓库镜像 选择控制台,进入容器镜像服务 选择个人实例 命名空…

阿里云国际站:密钥管理服务

文章目录 一、密钥管理服务的概念 二、密钥管理服务的功能 三、密钥管理服务的优势 一、密钥管理服务的概念 密钥管理服务KMS(Key Management Service)是您的一站式密钥管理和数据加密服务平台、一站式凭据安全管理平台,提供简单、可靠、…

【C++】【Opencv】minMaxLoc()函数详解和示例

minMaxLoc()函数 是 OpenCV 库中的一个函数,用于找到一个多维数组中的最小值和最大值,以及它们的位置。这个函数对于处理图像和数组非常有用。本文通过参数和示例详解,帮助大家理解和使用该函数。 参数详解 函数原型…

【Opencv】图像融合addWeighted()函数示例和详解

本文通过原理和示例对addWeighted()函数进行详解,,并通过改变融合系数展示多个结果,帮助大家理解和使用。 目录 函数原理示例权重(0.5,0.5)权重(0.8,0.2)权重&#xff08…

jupyter lab配置列表清单

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

Leetcode_50:Pow(x,n)

题目描述: 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000示例 2: 输入:x 2.10000, n 3 输出:9.26100示例 3: 输入&…

【Linux】第十三站:进程状态

文章目录 一、进程状态1.运行状态2.阻塞状态3.挂起状态 二、具体Linux中的进程状态1.Linux中的状态2.R状态3.S状态4.D状态5.T、t状态6.X状态(dead)7.Z状态(zombie)8.僵尸进程总结9.孤儿进程总结 一、进程状态 在我们一般的操作系统学科中,它…

电子学会2023年9月青少年软件编程(图形化)等级考试试卷(四级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(四级) 一、单选题(共10题,共30分) 1. 角色为一个紫色圆圈,运行程序后,舞台上的图案是?( )

C++算法:包含三个字符串的最短字符串

涉及知识点 有序集合 字符串 题目 给你三个字符串 a ,b 和 c , 你的任务是找到长度 最短 的字符串,且这三个字符串都是它的 子字符串 。 如果有多个这样的字符串,请你返回 字典序最小 的一个。 请你返回满足题目要求的字符串。…

RGMII回环:IDDR+ODDR+差分接口

目录 一、实验内容二、原理解释三、程序1、顶层文件:2、子模块2.1 oddr模块2.2、iddr顶层模块2.3、iddr子模块 3、仿真4、注意5、下载工程及仿真 一、实验内容 1、通过IDDR和ODDR的方式完成RGMII协议; 2、外部接口使用OBUFDS、IBUFDS转换成差分接口&…

2023/11/12总结

踩坑记录: org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column elm.flavors.id which is …

连通块中点的数量(并查集)

给定一个包含 n 个点(编号为 1∼n)的无向图,初始时图中没有边。 现在要进行 m 个操作,操作共有三种: C a b,在点 a 和点 b 之间连一条边,a 和 b 可能相等;Q1 a b,询问点…

TensorFlow学习笔记--(3)张量的常用运算函数

损失函数及求偏导 通过 tf.GradientTape 函数来指定损失函数的变量以及表达式 最后通过 gradient(%损失函数%,%偏导对象%) 来获取求偏导的结果 独热编码 给出一组特征值 来对图像进行分类 可以用独热编码 0的概率是第0种 1的概率是第1种 0的概率是第二种 tf.one_hot(%某标签…

木疙瘩踩坑日记-容易忽略的一些BUG

在一开始玩家务必很清楚这三个概念 图形:舞台上元素的最小单位。软件自带的以及外部导入的图片默认都是图形!最朴素的元素!可以添加预制动画、关键帧动画、进度动画(软件自带的形状) 元件:一个可以内部封…

阿里云国际站:全球加速GA

文章目录 一、前言 二、阿里云全球加速的概念 三、阿里云全球加速的功能优势 四、阿里云全球加速的原理 五、阿里云全球加速的应用场景 六、写在最后 一、前言 随着互联网的快速发展,网站速度已经成为了用户访问体验的一个重要指标。阿里云加速作为一种新的技…

Web开发:一键复制到剪切板功能实现思路

在很多网页页面中我们都使用到过一键复制内容到剪切板的小功能,那么,具体如何实现呢?下面来讲述基于原生JavaScript API的两种实现思路。 同步方式:document.execCommand 这种方式: ①优点:是最传统的方法…

把字符串转换为整数函数atoi

今天我们来认识一个函数&#xff0c;叫atoi&#xff0c;我们开始研究它吧&#xff01; 1.认识atoi 1.函数功能&#xff1a;将字符串转换为整数 只能将整数字符串转换为整数&#xff0c;不能转换字符字符串 2.头文件&#xff1a;#include<stdlib.h> 3.使用格式&#xff1a…