linux网络编程---IP地址

2023-05-16

目录

一、Linux下IP地址的表示方式

1.1、通用套接字的地址类型定义如下:

1.2、以太网中的地址类型表示

1.3、结构sockaddr和结构sockaddr_in的关系

1.4、本地socket中使用的地址类型

二、IP地址的转换

  2.1 字符串IP与二进制IP地址的转换

2.2 IP转换函数之通用的版本


一、Linux下IP地址的表示方式

在socket编程中,地址结构通常都是以sockaddr_开头的,不同的协议族有不同的地址后缀定义方式

1.1、通用套接字的地址类型定义如下:

struct sockaddr
{
    sa_family_t sa_family;	/* Common data: address family and length.  */
    char sa_data[14];		/* Address data.  */
};

上述结构中,定义在头文件<ifaddrs.h>中,sa_family_t实际上是 unsigned short int类型,故该结构的共占用16个字节。

1.2、以太网中的地址类型表示

从上面可以看出,在以太网编程中,使用struct sockaddr结构并不是很方便,没法直观的标示IP地址和端口等相关的信息,为此在以太网编程中,使用struct sockaddr_in来描述网络地址信息,其结构如下:

struct sockaddr_in
  {
    sa_family_t sin_family;
    in_port_t sin_port;			/* Port number.  */
    struct in_addr sin_addr;		/* Internet address.  */

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr)
			   - __SOCKADDR_COMMON_SIZE
			   - sizeof (in_port_t)
			   - sizeof (struct in_addr)];
  };

/* Internet address.  */
typedef uint32_t in_addr_t;
struct in_addr
  {
    in_addr_t s_addr;
  };

上述结构中,struct in_addr是使用一个uint32_t  网络字节序描述的IP地址信息,我们在转换成点分式的IP信息时,就是使用的该结构体中in_addr_t进行转换的。

1.3、结构sockaddr和结构sockaddr_in的关系

上面两节描述了通用的socket地址和以太网中使用的地址,那么,这两种结构有啥关系呢,其实,通过上面的结构体介绍,已经可以看到一个大概,sockaddr和sockaddr_in是一个同样大小的结构,其对应关系如下图:

 在sockaddr_in中,只使用了前面的8个字节,为了和sockaddr中保持结构大小一直,其后面的8个字节填充保留。

        在使用bind等相关函数时,通常都是使用的地址sockaddr,这样,我们在实际以太网编程使用的过程中,都是利用结构sockaddr_in进行地址信息的设置,然后使用强转为sockaddr类型

1.4、本地socket中使用的地址类型

在进程间通信中,也可以使用socket进行通信,与网络编程类似,其也有一个地址描述信息结构体,其结构体说明如下:

typedef unsigned short __kernel_sa_family_t;
#define UNIX_PATH_MAX	108

struct sockaddr_un {
	__kernel_sa_family_t sun_family; /* AF_UNIX */
	char sun_path[UNIX_PATH_MAX];	/* pathname */
};

其中,sun_family的取值一般使用AF_UNIX或者AF_LOCAL,sun_path是一个路径名。

二、IP地址的转换

上一章中,介绍了在网络编程中常用的几个与ip地址相关的数据结构,看完上面的一章,我们可能有这样的疑问,上面提到的IP地址都是用一个uint32_t 表示的,但是我们在实际中,见到的一般都是192.168.1.xx这种点分式的表示方法,那么,这两者之间如何转换?linux提供了一系列的函数,来完成这个工作。

  2.1 字符串IP与二进制IP地址的转换

Linux系统中提供了一组函数用于网络地址的字符串形式和二进制形式之间的转换,其形式为inet_xxx(),函数具体如下:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int inet_aton(const char *cp,struct in_addr *inp);
in_addr_t inet_addr(const char * cp);
char * inet_ntoa(struct in_addr in);

inet_aton()函数

该函数将cp中的十进制字符串类型的IP地址,转换为二进制的IP地址,转换成功后的值,保存在指向结构体 struct in_addr 中,由上一章可以知道,该结构中为 struct sockaddr_in中的一个变量。当转换成功时,返回一个非0值,当转换失败或者传入的一个非法地址时,返回值为0。

inet_addr()函数

该函数与inet_aton()函数类似,也是将字符串形式的字符串转换为二进制的IP地址,转换成功返回IP地址,这个IP地址时网络字节序的表达,如果转换失败或者参数非法,返回-1,因为-1的存储形式为(111111111111111),而IP地址255.255.255.255也是这个值,故不能使用这个函数对这个地址进行转换。

inet_ntoa()函数

该函数是将一个struct in_addr表示的一个IP地址转换为点分十进制的字符串IP地址,返回值是转换后的字符串指针,这个指针是该函数返回的,该函数会用一个静态区域保存该返回结果,有可能结果会被其他线程调用覆盖这个结果,故该函数并不是线程安全的,使用时需要注意。

2.2 IP转换函数之通用的版本

        在2.1节中,描述了常用的几个IP地址各种形式之间的转换函数,通过描述,可以知道,这几个函数或多或少存在缺陷,如只支持IPV4,或者不是线程安全的。下面介绍一对安全的与协议无关的地址转换函数,这两个函数都是可以重入支持多线程的,且这些函数支持IPv4和IPv6。

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

 inet_pton()函数

该函数是将字符串类型的IP地址转换为二进制类型,第一个参数af表示网络类型的协议族,在IPv4下的值为AF_INET,第二个参数src表示需要转换的字符串,第三个参数表示转换后的结构,在IPv4中,dst指向的是一个struct in_addr的结构体指针。该函数的返回值为-1的时候,通常是第一个参数af指定的协议族不支持造成的。当函数的返回值为0时,表示src指向的值不是合法的IP地址,当返回值为正值时,表示转换成功。

inet_ntop()函数

该函数是将二进制的网络IP地址转换为字符串,第一个参数af表示网络类型的协议族,在IPv4下的值为AF_INET,第二个参数src为需要转换的二进制IP地址,在IPv4中,src指向的是一个struct in_addr的结构体指针,第三个参数dst是保存结果的缓存区指针,第四个参数size是dst缓冲区的大小。当发生错误时,返回NULL,如af设置的协议族不支持,或者size参数设置的缓存区大小过小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux网络编程---IP地址 的相关文章

  • 解:高性能MEMS IMU解决方案-ADXRS290

    origin https ezchina analog com message 34890 对于复杂且高动态惯性配置的MEMS IMU应用 xff0c 评估功能时需要考虑许多属性 在设计周期早期评估这些属性优于追逐开放性成果 xff0c 从
  • 关于DIY电池均衡器--被动均衡---蓄电池--电瓶车电池组电压均衡的经历

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 前言 随着电动车长时间的反复使用 xff0c 电池参数难免会发生变化 xff0c 当电池组中各节电池参数不一时 xff0c 便会出现充电时
  • CMakeLists.txt与Makefile 的区别

    我平时一般是在windows使用VS编程 xff0c 但是偶尔在网上查资料的时候也会下载一些别人的代码 xff0c 其中就经常对CMakeLists txt和Makefile文件产生疑惑 xff0c 下面我来分析一下这两个经常使用的地方 C
  • 链接提示 extern "C"

    在 C 43 43 中调用 C 代码时 xff0c 需要给编译器指定 xff23 代码要按照 xff23 语言的编译器编译 xff0c 否则编译器会将 xff23 代码按照默认的C 43 43 编译器来编译 xff23 代码 xff0c 这
  • C/C++实现你的浪漫表白:浪漫流星雨表白程序,

    想要讨女朋友欢心也巩固自己所学的知识 xff0c 各位小伙伴有自己的想法了吗 xff1f 准备好想要怎样实施了吗 xff1f 有什么美好的计划了吗 xff1f 如果没有的话那么别慌 xff0c 我知道 xff0c 在座的各位肯定都是有自己的
  • DDR4原理及硬件设计

    DDR4 DRAM的工作原理 其引脚按照功能可以分为7类 xff1a 前3类为电源 地 配置 后4类为 xff1a 控制信号 时钟信号 地址信号 数据信号 电源 地 配置信号的功能很简单 xff0c 在此不赘述 控制信号主要是用来完成DDR
  • RK3568最小系统四层板设计总结

    很久没有关注DDR4和DDR5相关知识了 xff0c 利用找工作在家休息间隙从网上下载了RK3568的原理图和6层板的PCB参考设计 xff0c 将6层板改为4层板设计 进行总结之前 xff0c 先将设计时关于Allegro设计小技巧进行总
  • 部门管理经验小结

    很久没有针对管理做总结了 xff0c 回武汉后一直做工程师 xff0c 现对管理知识体系进行总结 xff1a 部门管理按照如下框图1所示 图1
  • STM32驱动开发(二)--USB Device RNDIS虚拟网卡(usb hound抓包完整数据流分析)

    一 简介 抓包工具 xff1a usb hound xff0c 本例使用安卓手机作为device 使用RNDIS功能连接电脑虚拟网卡 抓取完整数据流包按流程进行分析 数据流程熟悉之后 xff0c 查看stm32或者其他厂家的USB库开发RN
  • 瑞芯微RK3568控制板设计总结

    本周刚使用瑞芯微RK3568设计完成一款军用控制PCB板 xff0c 特进行总结便于后续设计提升效率 一 布局相关 器件布局效率及结果对于PCB设计至关重要 xff0c 特别在使用一个新处理器如何高效的展开器件的布局设计非常重要 xff0c
  • xilinx ise 下载地址

    10 1i ed2k file Xilinx ISE DS v10 1 iso 6345773056 5211e011944e70e0e682b3f90a613695 9 1i http download xilinx com direct
  • 输出比较模式时的TIM_OCMode_PWM1和TIM_OCMode_PWM2区别

    配合结构体成员TIM OCInitTypeDef TIM OCPolarity来一起使用 现在假定TIM OCInitTypeDef TIM OCPolarity 61 TIM OCPolarity High 则起始波形为高电位 若TIM
  • 运放稳定性连载4:运放网络,SPICE分析(1)

    作者 xff1a Tim Green xff0c 德州仪器公司 2 0 引言 本系列第2部分将着重分析运放电路 xff08 尤其是两种常见运放网络 xff09 的稳定性 重要的是必须在进行SPICE 仿真前先进行1 阶分析 xff08 主要
  • 运放稳定性连载18:电容负载稳定性:输出引脚补偿(2)

    我们的CMOS RRO输出引脚补偿实例如图9 20所示 这种实际电源应用采用OPA569功率运算放大器作为可编程电源 为了在负载上提供精确的电源电压 xff0c 可以采用一种差动放大器INA152对负载电压实施差动监控 闭环系统可以补偿任何
  • 音响开关机POP声/爆破声最新解决消除方法(D类音频功放IC应用实例)

    POP声是指音频器件在上电 断电瞬间以及上电稳定后 xff0c 各种操作带来的瞬态冲击所产生的爆破声 下文结合自身在推广小功率D类音频功放IC的过程中遇到的设计问题 xff0c 就音频系统开关机POP声的解决思路和大家分享一下 降低或去除P
  • 单片机stm32 USART串口实际应用解析

    stm32作为现在嵌入式物联网单片机行业中经常要用多的技术 xff0c 相信大家都有所接触 xff0c 今天这篇就给大家详细的分析下有关于stm32的出口 xff0c 还不是很清楚的朋友要注意看看了哦 xff0c 在最后还会为大家分享有些关
  • 串口数据传输当中的共用体和结构体转换

    https www cnblogs com codecamel p 4703174 html
  • extern "C" 引起的 error C2059

    extern 34 C 34 引起的 error C2059 转 在扩展名为 C的源文件中使用 extern 34 C 34 会引发错误 C2059 xff0c 错误提示为 xff1a error C2059 syntax error 39
  • 串口接收不定长数据

    这个通用的方法 xff0c 其实原理就是传输两个字节间是否超过了指定时间 xff0c 如果超过了一定的时间 xff0c 就认为是接收完一帧数据了 首先我们要知道 xff0c 串口是接收一个字节 xff0c 就会发生一次中断 xff0c 如果
  • VScode实现本地与远端同步开发的两种方式

    远程服务端开发IDE分析 这里仅对Pycharm 和 Visual Studio Code 简称VS或VScode 做简单的对比分析 xff0c Pycharm是面向专业开发者的Python IDE xff0c 分为Professional

随机推荐

  • MPU6050介绍及姿态解算

    1 介绍 xff1a MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件 xff0c 相较于多组件方案 xff0c 免除了组合陀螺仪与加速器时之轴间差的问题 xff0c 减少了安装空间 xff08 1 x
  • 2022 数学建模B题 高教社杯 含半成品论文 部分代码 全部数学模型 和全套思路

    2022 数学建模国赛B题 高教社杯 含半成品论文 部分代码 全部数学模型 和全套思路 定时更新 xff01 xff01 全部内容见 xff1a https mianbaoduo com o bread mbd Y5WUkppr 第一问 根
  • 【Java】String字符串的最大长度是多少?

    先说结论 对于Java字符串的最大长度 要分为2种情况进行讨论 编译期 一般情况下 最大长度为65534 运行期 Integer MAX VALUE 接下来通过对一个字节码文件反编译来解释一下为什么 一 编译期String字符串的最大长度为
  • 电脑间通过串口传输数据【串口练习】

    目录 一 串口通信概述1 串口如何连接2 如何计算波特率 二 实验演示1 实验设备2 实际电路连接3 通过串口传输数据 三 总结参考文献 一 串口通信概述 串口通信 xff08 Serial Communications xff09 的概念
  • 基于RK1126的人工智能安防检测方案,支持AI算法二次开发定制

    AI BOX 是一款基于 RK1126 设计的高性能 低功耗的边缘计算设备 xff0c 2Tops RK1126 支持 4K H264 H265 解码器解码 xff0c 支持1080P 64 60fps H264 H265 编码器编码 xf
  • 基于RK3399+PID的手持稳定云台的设计与实现

    手持稳定云台的主要作用是将外界环境因数引起的相机姿态变化进行隔离 如因操作者运动造成的机体震动 风阻力矩等 xff0c 为了确保工作中相机的视轴始终保持期望的姿态不动 云台相机要拍摄出高质量的影像最重要的就是保证相机的视轴相对目标保持稳定
  • 解决Linux 下server和client 通过TCP通讯:accept成功接收却报错的问题

    今天在写简单的TCP通讯例子的时候 xff0c 遇到了一个问题 server 和client能够连接成功 xff0c 并且client也能够正常发送 xff0c 但server就是接收不到 xff0c 在网上搜索一番后 xff0c 终于解决
  • stm32 各头文件或C文件功能

    stm32f10x con h 配置文件 xff1a 加载哪个外设 使能assert 对参数进行检查 xff0c 如果使能了assert 需要在main文件中添加 assert faild 函数 使能assert会增大编译出执行文件的大小
  • Linux网络编程 - TCP Socket 简单练习:select同时监测多个描述符

    运行方式 服务器端 xff0c 可以直接运行命令 xff0c 也可以带参数运行 xff0c 如果不带参数运行 xff0c 则程序自主获取主机ip xff0c 然后默认设定port和lisnum的值 其中port默认为6666 xff0c l
  • ubuntu安装 nautilus(右键单击出现打开终端的插件)

    最近由centos切到 ubuntu 14 04 xff0c 发现习惯的右键单击出现打开终端的选项没有 xff0c 于是查找发现可以安装 nautilus open terminal 插件 步骤如下 xff1a sudo apt get i
  • 云从科技宣布B+轮融资,多家国有基金入股,累计获资35亿元

    雷刚 发自 凹非寺 量子位 报道 公众号 QbitAI 又一家AI公司宣布完成新一轮融资 这次是起步重庆 xff0c 以CV发家的云从科技 云从官宣称 xff0c B 43 轮 xff0c 原股东跟投外 xff0c 多家国家战略投资基金 地
  • CURL 使用教程以及命令总结

    概述 cURL是一个利用URL语法在命令行下工作的文件传输工具 xff0c 1997年首次发行 它支持文件上传和下载 xff0c 所以是综合传输工具 xff0c 但按传统 xff0c 习惯称cURL为下载工具 cURL还包含了用于程序开发的
  • HTTP Basic 认证

    HTTP Basic 认证 Basic 认证是 Web 服务器于客户端之间进行认证的一种方式 xff0c 最初是在HTTP 1 0 规范 xff08 RFC 1945 xff09 中定义 xff0c 后续的有关安全的信息可以在HTTP 1
  • 无法定位程序输入点xxxxx于动态链接库KERNEL32.dll

    问题 xff1a 这次装完Win7 64位专业版 xff0c 安装Dell触摸板程序出现报错 xff0c 提示 无法定位程序输入点AddDllDirectory 于动态链接库KERNEL32 dll上 安装Atom也碰到了这个问题 xff0
  • 华为matebook14 笔记本触摸板操作

    公司发了一台华为了matebook笔记本 xff0c 为了方便操作 xff0c 结合华为官方推荐的操作 xff0c 总结如下的常见操作 xff0c 基本覆盖鼠标的操作 1 单击 xff1a 模拟鼠标左键单击 2 连续单击两次 xff1a 模
  • win10电脑任务栏软件图标变成白色解决办法

    在软件使用过程中 xff0c 有时会发现任务栏的软件图标消失 xff0c 变成了一个白色 xff0c 有点轻微强迫症的我肯定是不能容忍的 下面是总结网页及个人实践的一些记录 xff0c 供日后参考吧 xff1a 参考 xff1a https
  • tp-link 路由器iD登陆时,经常的发送请求失败,解决办法如下

    tp link 路由器iD登陆时 xff0c 经常的发送请求失败 xff0c 不知道这是啥BUG xff0c 解决办法如下 xff1a 1 进入精品应用 2 右边看到 重试 xff0c 3 然后再登陆tp link 路由器iD就成功了
  • c语言编程基础入门必备资料

    数据类型 基本数据类型 类型名称说明char字符类型存放字符的ASCII码int整型存放有符号整数short短整型存放有符号整数long长整型存放有符号整数long long存放有符号整数float单精度浮点型存放精度不高的小数double
  • 使用VMware+Ubuntu,无法切换大小写的异常处理

    问题 xff1a 在虚拟机VMware下 xff0c 使用Ubuntu系统时 xff0c 可能会出现当切换到大写字母后 xff0c 无法在切换成小写 解决方案 xff1a 这是VMware的bug xff0c 解决方法是如下 xff1a 1
  • linux网络编程---IP地址

    目录 一 Linux下IP地址的表示方式 1 1 通用套接字的地址类型定义如下 xff1a 1 2 以太网中的地址类型表示 1 3 结构sockaddr和结构sockaddr in的关系 1 4 本地socket中使用的地址类型 二 IP地