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

news2024/11/15 15:46:38

套接字(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地址转换为点分十进制字符串。

在这里插入图片描述

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

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

相关文章

深入理解指针(一)

目录 内存和地址 内存 如何理解编址 指针变量和地址 取地址操作符(&) 指针变量和解引用操作符(*) 指针变量 如何拆解指针类型 解引用操作符 指针变量的大小 ​编辑 指针变量类型的意义 指针的解引用 指针-整…

sass 封装媒体查询工具

背景 以往写媒体查询可能是这样的&#xff1a; .header {display: flex;width: 100%; }media (width > 320px) and (width < 480px) {.header {height: 50px;} }media (width > 480px) and (width < 768px) {.header {height: 60px;} }media (width > 768px) …

【Java】定时任务 - Timer/TimerTask 源码原理解析

一、背景及使用 日常实现各种服务端系统时&#xff0c;我们一定会有一些定时任务的需求。比如会议提前半小时自动提醒&#xff0c;异步任务定时/周期执行等。那么如何去实现这样的一个定时任务系统呢&#xff1f; Java JDK提供的Timer类就是一个很好的工具&#xff0c;通过简单…

【Qt】撤销/恢复的快捷键

使用Qt的时候&#xff0c;有时需要撤销修改的代码&#xff0c;但可能回撤过头了。 下面提供2个快捷键&#xff0c;当撤销过头时&#xff0c;可恢复撤销内容。 撤销的快捷键是 CtrlZ 恢复/向前的快捷键是 CtrlShiftZ 我们可以自定义快捷键。 点击【工具】->【选项】 点击…

基于XML的声明式事务

场景模拟 参考基于注解的声明式事务 修改Spring的配置文件 将Spring配置文件中去掉tx:annotation-driven标签&#xff0c;并添加配置&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org…

解决VSCode中文乱码问题

解决VSCode乱码问题 1.问题描述&#xff1a;2.原因分析&#xff1a;3.解决方案&#xff1a;1&#xff09;解决步骤2&#xff09;深入分析 4.总结 1.问题描述&#xff1a; 最近用vscode的时候突然发现中文字符出现乱码。在网上找了好几种方法都不行&#xff0c;用各种编码格式打…

【机器学习】八、规则学习

知识图谱与基本概念 基本概念 规则学习定义&#xff1a;从训练数据中学习出一组能用于对未见示例进行判别的规则。 规则定义&#xff1a;规则一般是&#xff1a;语义明确、能描述数据分布所隐含的客观规律或领域概念。 逻辑规则定义&#xff1a;⊕←?1⋀?2⋀?3…⋀??⊕…

file2Udp增量日志转出Udp简介

https://gitee.com/tianjingle/file2udp 很多时候服务产生的日志需要进行汇总&#xff0c;这种统一日志处理的方式有elb&#xff0c;而且很多日志组件也支持日志转出的能力。但是从广义上来说是定制化的&#xff0c;我们需要一个小工具实现tail -f的能力&#xff0c;将增量日志…

2024最新基于物联网单片机毕业设计选题汇总(合集)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

大数据技术与原理实验报告(MapReduce 初级编程实践)

MapReduce 初级编程实践 验环境&#xff1a; 操作系统&#xff1a;Linux&#xff08;建议Ubuntu16.04&#xff09;&#xff1b; Hadoop版本&#xff1a;3.2.2&#xff1b; &#xff08;一&#xff09;编程实现文件合并和去重操作 对于两个输入文件&#xff0c;即文件 A 和…

upload-labs关卡8(基于黑名单的点绕过)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第八关通关思路1、看源代码2、点绕过3、验证文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的网站做渗透测试&am…

用示波器测量高压电

示波器本身是不可以测试几千v的高压电电路的&#xff0c;一般自带的探头衰减倍数不够&#xff0c;需要使用高压差分探头或者高压探棒&#xff0c;将测试信号衰减到合适的范围再接入示波器。 普通探头能测差分电压吗&#xff1f;差分探头和普通探头有什么区别&#xff1f;全网最…

使用SQL分析数据科学职业发展趋势

大家好&#xff0c;在数据成为新石油的今天&#xff0c;了解数据科学职业的细微差别比以往任何时候都更加重要。无论你是正在寻找机会的数据爱好者&#xff0c;还是资深数据专家&#xff0c;使用SQL都可以让你深入了解数据科学就业市场。 本文可以带你了解哪些数据科学职位最具…

C语言精选练习题:(10)字幂数

每日一言 信心这个东西&#xff0c;什么时候都像个高楼大厦&#xff0c;但是里面会长白蚁。 --沉默的大多数 题目 打印1~100000之间的所有的字幂数&#xff0c;中间用空格分隔 (字幂数是指一个数的位数的n次方之和等于这个数本身) 如&#xff1a;370 3 ^ 3 7 ^ 3 0 ^ 3&…

CCC数字钥匙设计 --数字钥匙数据结构

1、数字钥匙是什么&#xff1f; 汽车数字钥匙&#xff0c;将传统实体钥匙数字化&#xff0c;用卡片、手机等智能设备来做数字钥匙的载体。 从而实现无钥匙进入/启动、为他人远程钥匙授权、个性化的车辆设置等功能。 目前市场上流行的数字钥匙方案是通过NFC、BLE、UWB通信技术…

C51--串口发送中断请求

在串口通信寄存器中有T1&#xff1a;发送中断请求标志位 换行 &#xff1a;\r\n #include "reg52.h" #include <intrins.h>sfr AUXR 0x8E;//串口初始化 void UartInit(void) //9600bps11.0592MHz {PCON & 0x7F; //波特率不倍速SCON 0x50; //8位数…

eNSP毕业设计系列-《大型企业网》-BGP网络无nat

客户主要需求&#xff1a;需要有三栋楼&#xff0c;每栋楼有三个业务。 又新增了要求&#xff0c;要双核心、双防火墙。 所以我根据客户的需求&#xff0c;完成了如下组网设计。 主要技术&#xff0c;MSTPVRRP链路聚合OSPF传统纵网&#xff0c;&#xff08;万金油组合&#…

AI 绘画 | Stable Diffusion WebUI的基本设置和插件扩展

前言 Stable Diffusion WebUI是一个基于Gradio库的浏览器界面&#xff0c;用于配置和生成AI绘画作品&#xff0c;并且进行各种精细地配置。它支持目前主流的开源AI绘画模型&#xff0c;例如NovelAI/Stable Diffusion。 在基本设置方面&#xff0c;Stable Diffusion WebUI的默…

ViewPager2和TabLayout协同使用

一、ViewPager2的基本用法 使用前先添加依赖&#xff1a; implementation androidx.appcompat:appcompat:1.4.0 // AndroidX AppCompatimplementation com.google.android.material:material:1.4.0 // Material Design Components1、制作Fragment 首先制作一个Fragment的xml布…

Mysql数据库管理---MySQL数据库连接、权限认证

1 mysql系统连接权限认证。 1 mysql数据库权限表在数据库启动时就载入内存&#xff0c;当用户通过身份验证后&#xff0c;就在内存中进行相应权限的存取。系统会用到mysql数据库中3个核心表&#xff1a;user&#xff0c;host&#xff0c;db。 主要包括&#xff1a; 用户列&a…