in_addr和in6_addr结构体
1. 介绍
in_addr 结构体(ipv4)和 in6_addr结构体(ipv6)
1)struct in_addr 结构体:表示一个32位的IPv4地址;
struct in_addr {
in_addr_t s_addr; //in_addr_t一般为32位的unsigned int,其字节顺序为网络字节序,即该无符号数采用大端字节序;其中每8位表示一个IP地址中的一个数值;
};
2)struct in6_addr结构体:表示一个32位的十六进制的IPv6地址;
2. 补充
1.网络字节序和主机字节序比较容易混乱(大端表示和小端表示):
网络字节序采用大端表示,就是数据的高位要存放到低地址。
而大多数主机字节序采用小端表示(也有采用大端表示的主机字节序),就是数据的低位放到低地址。
例:
如无符号整型1338378,的二进制表示为:
数据的高位----------------------------》数据的低位
00000000 00010100 01101100 00001010
所以采用小端表示的主机字节序时,内存中存放的形式为:
低地址----------------------------------》高地址
00001010 01101100 00010100 00000000
3. 应用
函数inet_ntoa和inet_aton(ipv4)+ inet_pton()和inet_ntop()函数(ipv4+ipv6)
1)inet_ntoa()函数用于将一个十进制网络字节序转换为点分十进制IP格式的字符串。
函数原型:char*inet_ntoa(struct in_addr in);
返回值:正确执行返回一个字符指针(十进制ip字符串);错误返回NULL;
2)inet_aton是一个改进的方法来将一个字符串IP地址转换为一个32位的网络序列IP地址。
函数原型:int inet_aton(const char *string, struct in_addr *addr);
返回值:成功执行(string点分十进制地址正确)函数的返回值非零,如果输入地址不正确则会返回零;
3)inet_pton将一个字符串IP地址转换为一个网络序列IP地址。
函数原型:int inet_pton(int af, const char *src, void *dst);
参数:af:地址簇,可选项:AF_INET(IPv4);AF_INET6(IPv6);
src:传入的IP地址
dst:将ip地址转换成网络字节序后的结果存储在dst指向的in_addr结构体中 s_addr 成员;或in6_addr结构体中;
返回值:若成功则为1,若输入不是有效的表达式则为0,若出错则为-1
4)inet_ntop将一个十进制网络字节序转换为点分十进制IP格式的字符串。
函数原型:const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);
参数:af:地址簇,可选项:AF_INET(IPv4);AF_INET6(IPv6);
src:传入的网络字节序;
dst:传出的IP地址;
size:IP地址长度;
返回值:若成功则为指向结构的指针,若出错则为NULL
注:inet_ntoa()和inet_aton()只适用于ipv4地址;inet_pton()和inet_ntop()函数,ipv4和ipv6均适用;
函数inet_addr()和inet_network()
1)函数inet_addr()原型: in_addr_t inet_addr(const char *cp);
参数:cp传入的一个点分十进制的IP地址
返回值:正确返回网络字节序(无符号长整形);失败返回-1(INADDR_NONE);
2)函数inet_network()原型:in_addr_t inet_network(const char *cp);
参数:cp传入的一个点分十进制的IP地址
返回值:正确执行将返回主机字节序(无符号长整数型数);如果传入的字符串不是一个合法的IP地址,将返回INADDR_NONE;
注:inet_addr返回的整数形式是网络字节序,而inet_network返回的整数形式是主机字节序
in_addr和in6_addr结构体相关推荐
- IPv4地址的结构体与网络字节序
IPv4地址的结构体 /* Fixed-size types, underlying types depend on word size and compiler. */ typedef signed ...
- struct in_addr 结构体
struct in_addr 结构体: struct in_addr {in_addr_t s_addr; }; 表示一个32位的IPv4地址. in_addr_t 一般为32位的unsigned i ...
- 结构体sockaddr、sockaddr_in、sockaddr_in6之间的区别和联系
本文转自https://blog.csdn.net/albertsh/article/details/80991684,简单易懂,赞. 前言 最近在学习网络相关的知识,虽然之前代码写了不少,但是长时间 ...
- C 语言编程 — 结构体的数据类型转换
目录 文章目录 目录 数组类型强制类型转换为结构体 结构体之间的强制类型转换 数组类型强制类型转换为结构体 先看一个例子: #include <stdio.h>int main(void) ...
- linux c 域名转ip函数 gethostbyname 返回结构体 hostent 简介
在linux网络编程中,gethostbyname函数可以通过域名url直接获得ip地址相关信息,返回的是一个名为hostent的结构体,通过man gethostbyname手册查询后,发现该结构体 ...
- 三、初识Socket套接字结构体
一.初识Socket套接字结构体 1.通用套接字结构体类型 struct sockaddr{sa_family_t sa_family; //协议簇char sa_data[14]; //协议簇数据} ...
- linux sock结构体,struct socket结构体详解
在内核中为什么要有struct socket结构体呢? struct socket结构体的作用是什么? 下面这个图,我觉得可以回答以上两个问题. 由这个图可知,内核中的进程可以通过使用struct ...
- 内核中用于数据接收的结构体struct msghdr
我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,ping另一台主机172.16.48.1.我们使用系统调用send ...
- sockaddr_in 结构体
strcut sockaddr 是用来描述 IPv4 地址协议,原始结构体 sockaddr 已经被废弃掉了. 常使用 strcut sockaddr_in 类型. struct sockaddr_i ...
最新文章
- 她92年的,27岁,当上浙大博导。
- MySQL的并发控制与加锁分析
- 2021牛客暑期多校训练营4 G-Product(组合意义+容斥原理)
- ***error*** (zip#Browse) unzip not available on your system
- 初级java程序员怎样快速提升自己
- R语言中%in%的作用
- java easyui 模板_漂亮easyui皮肤组件html模板下载A 最新 最全
- WIn10下如何为不同的显示器设置不同的桌面背景
- 银行卡quickpass闪付芯片通过EVM/PBOC读取信息
- 图像插值理论研究——双三次插值(双立方插值)
- 临床试验中的样本量估算---实践篇
- 工作小记 编译 ffmpeg gpu 版本
- hdwiki v5.1存在SQL注入导致可下载任意文件
- html5 contenteditable 可编辑属性
- 《俪影2046》v2.09 完美破解
- 如何设置计算机的休眠时间,电脑的睡眠时间如何设置?
- 从目标检测到小目标检测
- 张勇卸任淘宝董事长,戴珊接任;苹果称不送充电器已节省55万吨矿石;Windows彻底告别SMB1传输协议|极客头条
- 全栈开发实战|​名片管理系统的设计与实现(SSM + JSP)
- 55岁李连杰近照疯传:人生下半场,拼的是健康