IPv4地址的结构体与网络字节序
IPv4地址的结构体
/* Fixed-size types, underlying types depend on word size and compiler. */
typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef signed short int __int16_t;
typedef unsigned short int __uint16_t;
typedef signed int __int32_t;
typedef unsigned int __uint32_t;
#if __WORDSIZE == 64
typedef signed long int __int64_t;
typedef unsigned long int __uint64_t;
#else
__extension__ typedef signed long long int __int64_t;
__extension__ typedef unsigned long long int __uint64_t;
#endif/* Internet address. */
typedef uint32_t in_addr_t;
struct in_addr{in_addr_t s_addr;};/* POSIX.1g specifies this type name for the `sa_family' member. */
typedef unsigned short int sa_family_t;/* This macro is used to declare the initial common membersof the data types used for socket addresses, `struct sockaddr',`struct sockaddr_in', `struct sockaddr_un', etc. */#define __SOCKADDR_COMMON(sa_prefix) \sa_family_t sa_prefix##family/* Structure describing a generic socket address. */
struct sockaddr{__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */char sa_data[14]; /* Address data. */};/* Structure describing an Internet socket address. */
struct sockaddr_in{__SOCKADDR_COMMON (sin_);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)];};
sin_family: 每种协议族使用的地址族均不同,IPv4使用4字节地址族,IPv6使用16字节地族。
Name Purpose Man pageAF_UNIX Local communication unix(7)AF_LOCAL Synonym for AF_UNIXAF_INET IPv4 Internet protocols ip(7)AF_IPX IPX - Novell protocolsAF_INET6 IPv6 Internet protocols ipv6(7)AF_PACKET Low-level packet interface packet(7)
sin_port: 用于以网络字节序保存16位端口号。
sin_addr: 用于以网络字节序保存32IP地址。同时观察结构体,in_addr。该结构体声明为uint32_t,因此只需要当作32位整数即可。
/* Internet address. */
typedef unsigned int __uint32_t;typedef uint32_t in_addr_t;
struct in_addr{in_addr_t s_addr;};
sin_zero: 无特殊意义。只是为结构体sockaddr_in的大小与sockaddr结构体保持一致而插入的成员,必须填充为零。bind函数在第二个参数就得到sockaddr的结构体变量地址值。此结构体成员sa_data保存的地址信息中需包含IP地址和端口号剩余部分填充零。
/* POSIX.1g specifies this type name for the `sa_family' member. */
typedef unsigned short int sa_family_t;/* This macro is used to declare the initial common membersof the data types used for socket addresses, `struct sockaddr',`struct sockaddr_in', `struct sockaddr_un', etc. */#define __SOCKADDR_COMMON(sa_prefix) \sa_family_t sa_prefix##family/* Structure describing a generic socket address. */
struct sockaddr{__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */char sa_data[14]; /* Address data. */};# define __CONST_SOCKADDR_ARG const struct sockaddr */* Give the socket FD the local address ADDR (which is LEN bytes long). */
extern int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len)__THROW;if (bind(listenfd, (struct sockaddr*) &servaddr, sizeof servaddr) < 0) {perror("bind");
}
字节序(Order)网络字节序
计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。举例来说,数值0x3322使用两个字节储存:高位字节是0x33,低位字节是0x22。网路字节序统一为大端字节序。
- 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。
- 小端字节序:低位字节在前,高位字节在后,即以0x2233形式储存。
字节序转换
/* Functions to convert between host and network byte order.Please note that these functions normally take `unsigned long int' or`unsigned short int' values as arguments and also return them. Butthis was a short-sighted decision since on different systems the typesmay have different representations but the values are always the same. */extern uint32_t ntohl (uint32_t __netlong) __THROW __attribute__ ((__const__));
extern uint16_t ntohs (uint16_t __netshort)__THROW __attribute__ ((__const__));
extern uint32_t htonl (uint32_t __hostlong)__THROW __attribute__ ((__const__));
extern uint16_t htons (uint16_t __hostshort)__THROW __attribute__ ((__const__));
- htonl中的h表示主机(host)字节序。
- htonl中的n表示网络(network)字节序。
- htonl中的s表示short,l表示long。
通常s代表2字节short,因此用于端口号转换,l代表4字节long,因此用于IP地址转换。
字符串信息转化为网络字节序的整数型
//成功时返回32位大端序整数型值,失败时返回INADDR_NONE,并且可以检测无效IP地址。
in_addr_t inet_addr(const char *__cp)
//成功时返回1(true),失败时返回0(false)
int inet_aton(const char *__cp, struct in_addr *__inp)
- __cp:含有需转换的IP地址信息的字符串地址值。
- __inp:将保存结果的in_addr结构体变量的地址值。
//成功时返回转换的字符串地址值,失败时返回-1
char *inet_ntoa(struct in_addr __in)
适用于IPv4地址和IPv6地址地址转换函数
/* Convert from presentation format of an Internet number in bufferstarting at CP to the binary network format and store result forinterface type AF in buffer starting at BUF. */
extern int inet_pton (int __af, const char *__restrict __cp,void *__restrict __buf) __THROW;/* Convert a Internet address in binary network format for interfacetype AF in buffer starting at CP to presentation form and placeresult in buffer of length LEN astarting at BUF. */
extern const char *inet_ntop (int __af, const void *__restrict __cp,char *__restrict __buf, socklen_t __len) __THROW;
inet_pton函数将用字符串表示的IP地址src(用点分十进制字符串表示的IPv4地址或用十六进制字符串表示的IPv6地址)转换成用网络字节序整数表示的IP地址,并把转换结果存储于dst指向的内存中。其中,af 参数指定地址族,可以是AF_ INET 或者AF_ INET6。inet_ pton 成功时返回1,失败则返回0并设置errno日。inet ntop 函数进行相反的转换,前三个参数的含义与inet pton的参数相同,最后一个参数cnt指定目标存储单元的大小。下面的两个宏能帮助我们指定这个大小(分别用于IPv4和IPv6):
#include <netinet/in.h>
#define INET_ADDRSTRLEN 16
#define INET6_ADDRSTRLEN 46
inet_ ntop 成功时返回目标存储单元的地址,失败则返回NULL并设置ermo。
INADDR_ANY
/* 自动获取服务端的计算机IP地址 */
#define INADDR_ANY ((in_addr_t) 0x00000000)
IPv4地址的结构体与网络字节序相关推荐
- Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)
IPv4套接字地址结构 struct sockaddr_in {uint8_t sinlen;(4个字节)sa_family_t sin_family;(4个字节)in_port_t sin_port ...
- 网络编程-IP地址、端口号、网络字节序
IP地址.端口号.网络字节序 本文中部分名词可见: 协议.TCP/IP模型.数据包封装与分用 一.IP地址 1. 简单认识 IP协议有两个版本:IPv4和IPv6. (1)IP地址在IP协议中,用来标 ...
- IP地址、端口号、网络字节序
本文中部分名词可见: 协议.TCP/IP模型.数据包封装与分用 一.IP地址 1. 简单认识 IP协议有两个版本:IPv4和IPv6. (1)IP地址在IP协议中,用来标识网络中不同主机的地址. (2 ...
- Socket编程:必须要了解的网络字节序和转换函数
目录 主机字节序和网络字节序 转换函数 htonl .htons .ntohl 和 ntohs inet_addr .inet_aton 和 inet_ntoa inet_pton 和 inet_nt ...
- 【C++】Winsock套接字编程,struct sockaddr、sockaddr_in,主机网络字节序
前一篇关于windows平台下winsock套接字编程的相关api struct sockaddr与struct sockaddr_in 在bind函数,connect函数里提到了套接字编程网络地址信 ...
- java 网络字节序转主机字节序_Linux下查看网络连接
排查系统故障的时候,我们通常会需要查看某一进程是否监听了某一特定端口或者系统中所有监听端口列表等,这时候就需要用到系统提供的某些命令或文件了,下面总结了一些常用的获取系统网络连接的命令. 0x01 n ...
- 主机字节序和网络字节序
1.大端字节序和小端字节序: 大端字节序存储时值的高位存储在较小的地址,值的低位存储在较大的地址. 小端字节序存储时值的高位存储在较大的地址,值的低位存储在较小的地址. 以0x12345678为例: ...
- 1.socket编程:socket编程,网络字节序,函数介绍,IP地址转换函数,sockaddr数据结构,网络套接字函数,socket相关函数,TCP server和client
1 Socket编程 socket这个词可以表示很多概念: 在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程,"IP 地址+端 ...
- 【Linux网络编程学习】预备知识(网络字节序、IP地址转换函数、sockaddr数据结构)
此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分. 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小 ...
最新文章
- Android 使用adb 命令截图 的方法
- Python零基础入门(4)——分支与循环练习题
- 哈佛大学让青蛙断腿再生:有骨头有血管,对刺激物还会产生强烈踢腿反应
- git 基础教程总结
- java图像处理之图像融合
- 【WC2014】时空穿梭【组合数】【莫比乌斯反演】【整除分块】【暴力多项式】
- linux常用翻页,20150823-Linux常用命令
- idea中tomcat服务器的配置
- 判断IMEI或MEID是否合法
- (转,记录用)jQuery页面加载初始化的3种方法
- 数据结构第三篇——线性表的链式存储之单链表
- python django企业固定资产管理系统pycharm项目源码lw
- 对“陶哲轩-来自特征值的特征向量”的理解
- mysql允许远程链接,开放3306端口
- 比较正确的 iPhone7/7+ 的进入DFU的方法是这样的
- 基于主从博弈的智能小区电动汽车充电管理及代理商定价策略
- [EULAR文摘] 超声滑膜炎和腱鞘炎对已获临床缓解患者病情复发的预测
- 卸载oracle方法
- android pm命令不可用,adb命令pm工具讲解
- python基础教程菜鸟教程-Python从基础到入门系列教程
热门文章
- 如何实现脑肿瘤红黄绿分割展示
- 将对称分量转换为abc相量
- CMT2380F32模块开发4-UART例程
- Centos7、Centos Stream8、Centos Stream9无界面下使用yum安装chrome,方便进行Selenium无头模式自动化
- QST青软实训学员学习总结-2020/5/24-STM32
- redshift 踩坑
- springmvc 发送PUT 和 DELETE 请求
- DeepAR:Probabilistic forecasting with	autoregressive recurrent network
- CSS-border边框
- Calling brew cask install is disabled! Use brew install [--cask] instead