socket地址API(Linux网络编程基础API)

news2024/11/15 17:40:34

socket

目标进程的标识(套接字)由两部分组成:

  1. IP地址:标识出计算机所在的网络位置。
  2. 端口号:标识出计算机上特定的进程。

字节序

字节序定义了多字节数据在内存中的存储顺序,是处理器架构的特性。字节序有两种:

  1. 大端字节序:最高地址存储最低有效字节。
  2. 小端字节序:最低地址存储最低有效字节。
eg. 检测本机字节序
#include <stdio.h>
// 函数用于检测字节序
void byteorder() {
    // 定义一个共用体,用于检查字节序
    union {
        int value;                 // 整型变量
        char union_bytes[sizeof(int)]; // 存储整型变量的字节数组
    } test;
    // 最高有效字节是4 最低有效字节是1
    test.value = 0x04030201;

    // 根据字节数组的内容判断字节序
    if (test.union_bytes[0] == 4) {
        printf("big endian\n"); // 大端序:最低字节地址存储最高有效字节
    } else if (test.union_bytes[0] == 1) {
        printf("little endian\n"); // 小端序:最低字节地址存储最低有效字节
    } else {
        printf("unknown\n");
    }
}

int main() {
    byteorder(); 
    return 0;
}

无论什么字节序,最高有效字节总在最左边,最低有效字节总在最右边。一个32位整数0x04030201,最高有效字节是4,最低有效字节是1。若将字符指针cp强行转换到这个整型数地址,在小端序处理器上,cp[0]指向1;在大端序处理器上,cp[0]指向4。

网络字节序

在网络协议中(如 TCP/IP)通常使用大端序来确保不同系统间的数据一致性。Linux提供4个函数完成主机字节序和网络字节序的转换。

#include <netinet/in.h>

// 将32位主机字节序整数转换为网络字节序
uint32_t htonl(uint32_t hostint32);

// 将16位主机字节序整数转换为网络字节序
uint16_t htons(uint16_t hostint16);

// 将32位网络字节序整数转换为主机字节序
uint32_t ntohl(uint32_t netint32);

// 将16位网络字节序整数转换为主机字节序
uint16_t ntohs(uint16_t netint16);

 长整型函数通常用来转换IP地址,短整型函数用来转换端口号。

地址格式

常见地址族

套接字地址是用来标识特定套接字的通信端点,并且它的格式取决于所使用的地址族。每个地址族(如 IPv4、IPv6、Unix 域等)有其特定的地址格式和解析规则。常见的地址族包括:

描述协议族地址族地址值含义和长度
UNIX本地协议族PF_UNIXAF_UNIX文件系统中的路径,长度可达108字节
TCP/IPv4协议族PF_INETAF_INET16bit端口号和32bitIPv4地址,共6字节
TCP/IPv6协议族PF_INET6AF_INET616bit端口号,32bit流标识和128bitIPv6地址,共26字节
Linux系统通用socket地址结构体
#include <bits/socket.h>

// 通用套接字地址结构体
struct sockaddr {
    sa_family_t sa_family;     // 地址族,例如 AF_INET 或 AF_INET6
    char sa_data[14];         // 地址数据,存储地址信息
};

为了简化不同协议族(如IPv4、IPv6、UNIX域套接字等)的地址操作,Linux提供了专门的套接字地址结构体。这些结构体封装了协议族特定的信息,使得设置和获取IP地址、端口号等操作更直观。

UNIX本地协议族
#include <sys/un.h>

// UNIX域套接字地址结构体
struct sockaddr_un
{
    sa_family_t sun_family;  // 地址族,通常设置为 AF_UNIX
    char sun_path[108];      // 套接字路径,用于本地通信的文件系统路径
};
TCP/IPv4协议族
#include <netinet/in.h>
#include <stdint.h>

// IPv4套接字地址结构体
struct sockaddr_in {
    sa_family_t sin_family;  // 地址族,通常设置为 AF_INET
    in_port_t sin_port;      // 端口号,16位无符号整数,网络字节序
    struct in_addr sin_addr; // IP地址,结构体类型为 struct in_addr
};

// IPv4地址结构体
struct in_addr {
    in_addr_t s_addr; // IPv4地址,32位无符号整数,网络字节序
};
TCP/IPv6协议族
#include <stdint.h>
#include <netinet/in.h>

// IPv6 地址的结构体
struct sockaddr_in6 {
    sa_family_t sin6_family;     // 地址族,IPv6 通常为 AF_INET6
    in_port_t sin6_port;          // 端口号(网络字节序)
    uint32_t sin6_flowinfo;      // 流量信息(通常用于 QoS)
    struct in6_addr sin6_addr;  // IPv6 地址
    uint32_t sin6_scope_id;      // 地址作用域 ID(用于链路本地地址和站点本地地址)
};

// IPv6 地址的结构体
struct in6_addr {
    uint8_t s6_addr[16]; // IPv6地址(16 字节,128 位)
};

IP地址转换函数

适用于IPv4的函数
in_addr_t inet_addr(const char* strptr);

用于将IPv4地址从点分十进制格式的字符串转换为网络字节序的32位二进制格式,一般改用inet_aton了。

strptr:点分十进制格式的 IPv4 地址字符串。

返回值:转换后的in_addr_t类型的地址(网络字节序)。如果字符串无效或地址无法解析,则返回INADDR_NONE(通常是-1)。

int inet_aton(const char* cp, struct in_addr* inp);

用于将一个IPv4地址的字符串表示形式转换为网络字节序的二进制格式,并将结果存储在struct in_addr结构体中。

cp:点分十进制格式的 IPv4 地址字符串。

inp:指向struct in_addr结构体的指针,用于存储转换后的二进制地址。

返回值:成功返回1,表示地址字符串成功转换;失败返回0,表示地址字符串无法转换。

char* inet_ntoa(struct in_addr in);

inp:结构体in_addr类型,包含一个 32 位的 IPv4 地址(以网络字节序存储)。

返回值:指向静态缓冲区的指针,该缓冲区包含转换后的点分十进制字符串表示形式。请注意,这个缓冲区是静态的,所以每次调用inet_ntoa时它的内容可能会被覆盖。

eg. 缓冲区覆盖案例
#include <stdio.h>
#include <arpa/inet.h>

int main() {
    struct in_addr addr1;
    struct in_addr addr2;
    addr1.s_addr = htonl(0xc0a80101); // 192.168.1.1
    addr2.s_addr = htonl(0xc0a80102); // 192.168.1.2

    char* str1 = inet_ntoa(addr1); // addr1转换为字符串 存储在静态缓冲区中
    char* str2 = inet_ntoa(addr2); // addr2转换为字符串 存储在同一个静态缓冲区中 覆盖了之前的内容
    
    printf("address 1: %s\n", str1);
    printf("address 2: %s\n", str2);
}

 

适用于IPv4和IPv6的函数 
int inet_pton(int af, const char *src, void *dst);

用于将一个IP地址字符串转换为网络字节序的二进制格式。

af:地址族,指定要转换的IP地址类型,如AF_INET,AF_INET6。

src:指向包含IP地址文本表示的字符串的指针。

dst:指向一个缓冲区的指针,用于存储转换后的二进制格式的IP地址。对于IPv4,指向struct in_addr结构体;对于IPv6,指向struct in6_addr结构体。

返回值:1,成功;0,输入的IP地址字符串格式无效;-1,发生错误,错误可通过errno获取。

const char* inet_ntop(int af, const void* src, char* dst, socklen_t cnt);

 用于将网络字节序的IP地址转换为文本字符串表示。

af:地址族,指定要转换的IP地址类型,如AF_INET,AF_INET6。

src:指向包含网络字节序IP地址的二进制数据的指针。对于IPv4,指向struct in_addr结构体;对于IPv6,指向struct in6_addr结构体。

dst:指向一个字符数组的指针,用于存储转换后的文本格式的IP地址。

cnt:dst指向的缓冲区的大小,以字节为单位。

两个宏可以用于指定cnt大小:

#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46

返回值:成功,返回dst指针,指向包含文本格式IP地址的缓冲区;失败返回NULL,错误可通过errno获取。

 推荐一下

https://github.com/0voice

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

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

相关文章

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于模型-数据混合驱动的区域能源互联网韧性在线评估》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

不管你是网工小白还是大佬,一定要焊死在电脑上的6款工具!

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 你们好&#xff0c;我的网工朋友。 咱网工日常工作可谓状况多多&#xff0c;从配置复杂的网络设备到排除棘手的连接故障&#xff0c;再到维护网络…

GaussDB关键技术原理:高弹性(五)

书接上文GaussDB关键技术原理&#xff1a;高弹性&#xff08;四&#xff09;从扩容流程框架方面对hashbucket扩容技术进行了解读&#xff0c;本篇将从日志多流和事务相关方面继续介绍GaussDB高弹性技术。 目录 4.2 日志多流 4.2.1 日志多流总体流程 4.2.2 基线数据传输 4.…

统信服务器操作系统【d版系统上Ansible工具】配置方法

在统信服务器操作系统d版本上进行安装Ansible工具的方法以及配置方法。 文章目录 准备环境功能描述安装与配置一、 安装ansible工具1. 直接 命令安装2. 验证安装结果3. 配置ssh免密登录二、Ansible使用1. 主机清单配置2. ansible命令3. ansible模块三、 playbook配置文件1. 执行…

如何简化机器人模型,加速仿真计算与可视化

通常,我们希望将自己设计的机器人模型导入仿真环境。由于是通过 CAD 软件设计的,导出的 urdf 使用 STL 或 DAE 文件来表示 3D 几何。但原始的 STL 或 DAE 文件通常过于复杂(由数十万个三角面片组成),这会减慢仿真速度,有时也会导致仿真软件报错(如Webots)。为了在正确描述…

如何学懂C++语言:C++从入门到精通的全面指南(完整C++学习笔记)

数字人助手猿小美带你一起学编程 一、引言 作为一名拥有多年开发经验的技术人员&#xff0c;我的职业生涯涵盖了多种编程语言&#xff0c;包括 C 语言、C、C# 和 JavaScript 等。在我多年的编程生涯中&#xff0c;这些语言不仅丰富了我的知识储备&#xff0c;还极大地拓…

10个A/B测试指标以分析结果和衡量成功

为什么A/B测试分析很重要&#xff1f; 到现在&#xff0c;您可能已经熟悉了A/B测试的基本概念及其用途。 简而言之&#xff0c;A/B测试是将两个或多个着陆页、营销资产或单个元素&#xff08;如标题&#xff09;进行对比&#xff0c;以帮助您找出哪个表现最好。 这些测试帮助…

MUNIK谈ASPICE系列专题分享(五)如何选一家ASPICE评估服务认证公司

引言&#xff1a; 如何选一家适合企业自身的ASPICE评估公司&#xff0c;哪些点应该是企业关注的。 MUNIK公司作为一家全球认可的ASPICE服务公司&#xff0c;我们的专家由德国和印度&#xff0c;以及本地化的ASPICE资质评估老师构成。基于MUNIK丰富的项目经验&#xff0c;我们…

HighlightPlus插件介绍

仅对官方文档进行了翻译 注意:官方文档本身就落后实际,但对入门仍很有帮助,核心并没有较大改变,有的功能有差异,以实际为准.(目前我对一些已不存在的内容进行了删减,但还有很多没有处理,后续我会继续维护该文档) 为什么为该插件做翻译?功能强大,使用简单,且还在维护. 翻译依…

【华为OD】2024D卷——生成哈夫曼树

题目描述&#xff1a; 给定长度为n的无序的数字数组&#xff0c;每个数字代表二叉树的叶子节点的权值&#xff0c;数字数组的值均大于等于1。 请完成一个函数&#xff0c;根据输入的数字数组&#xff0c;生成哈夫曼树&#xff0c;并将哈夫曼树按照中序遍历输出。为了保证输出的…

PowerShell install 一键部署Oracle19c

Oracle19c前言 Oracle 19c 是甲骨文公司推出的一款企业级关系数据库管理系统,它带来了许多新的功能和改进,使得数据库管理更加高效、安全和可靠。以下是关于 Oracle 19c 的详细介绍: 主要新特性 多租户架构:支持多租户架构,允许多个独立的数据库实例在同一个物理服务器上…

【PLW003】设备器材云端管理平台v1.0(SpringBoot+Mybatis+NodeJS+MySQL前后端分离)

设备器材云端管理平台是一种专为各种设备&#xff08;如教育行业中的实验设备、建筑行业中的施工设备等&#xff09;租赁或共享孵化的数字化管理工具&#xff0c;旨在融合数字化手段&#xff0c;提高各种设备器材的管理效率、 确保设备的安全稳定运行&#xff0c;并优化资源使用…

分布式事务学习笔记(五)微服务实现Seata TCC模式、TC服务器高可用异地容灾

文章目录 前言6 Seata TCC 模式6.1 实现原理6.2 优缺点6.3 空回滚和业务悬挂6.3.1 空回滚6.3.2 业务悬挂 6.4 微服务实现TCC模式6.4.1 思路分析6.4.2 声明TCC接口6.4.3 编写实现类6.4.4 Controller类调用TCC接口6.4.5 修改配置文件application.yml6.4.6 重启微服务并测试 7 TC服…

【Linux】常用指令(中)(附带基础指令的详细讲解、Linux的一些附加知识)

文章目录 前言1. Linux基础常用指令1.1 通配符 "*"1.2 man指令&#xff08;重要&#xff09;1.2.1 man指令的语法 1.3 何为"指令"&#xff1f;(附带知识)1.4 echo指令1.5 cat指令1.6 Linux下一切皆文件&#xff01;1.6.1 ">" 输出重定向1.6.2…

FP6296XR-G1 10A电流模式非同步PWM升压转换器芯片IC

一般说明 F1 6296是目前最先进的直流一直流转换器。是一个带有内置15mΩ功率MOSFET使此稳压器具有高功率效率。误差放大器的非逆变输入端连接到1.2V的精密基准电压。电流模式控制和外部补偿网络使系统稳定容易灵活。FP6296采用SOP-8L(EP)封装&#xff0c;可用于应用领域…

基于 K8S kubernetes 搭建 安装 EFK日志收集平台

目录 1、在k8s中安装EFK组件 1.1 安装elasticsearch组件 1.2 安装kibana组件 1.3 安装fluentd组件 文档中的YAML文件配置直接复制粘贴可能存在格式错误&#xff0c;故实验中所需要的YAML文件以及本地包均打包至网盘 链接&#xff1a;https://pan.baidu.com/s/15Ryaoa0_…

各大平台统遭入侵??区块链市场遭攻击损失近3亿!

今年&#xff0c;全球发生多起骇人听闻的勒索入侵软件攻击事件&#xff0c;黑客组织利用各种手段和技术&#xff0c;不断试图突破网络安全防线&#xff0c;窃取敏感信息、破坏系统运行&#xff0c;甚至进行勒索和敲诈&#xff0c;使得网络安全问题日益凸显其重要性和紧迫性。 S…

【北京迅为】《STM32MP157开发板使用手册》- 第三十五章 A7 和 M4 联合调试

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

【MySQL】表的操作【有关表结构的操作】【创建、查看、删除、修改表结构】

目录 表的操作1.创建表2.查看表结构3修改表3.1修改表名3.2添加字段/列3.3修改字段/列3.4删除字段/列3.5对单一字段/列 重命名 4.删除表 表的操作 1.创建表 创建表的语句语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) ch…

基于SSM的在线家用电器销售系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSSMVueMySQL的在线家…