htons/ntohs、inet_aton/inet_ntoa、inet_pton/inet_ntop函数详解

2024-03-25 04:58

本文主要是介绍htons/ntohs、inet_aton/inet_ntoa、inet_pton/inet_ntop函数详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在介绍htons等函数之前,必须先介绍网络字节序与主机字节序

网络字节序和主机字节序

网络字节顺序NBO(Network Byte Order): 按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。
主机字节顺序(HBO,Host Byte Order): 不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。

主机字节序就是我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。引用标准的Big-EndianLittle-Endian的定义如下:
a)Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

网络字节序:4个字节的32bit值以下面的次序传输:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序。

注意:在将一个地址绑定到socket的时候,请先将主机字节序转换成为网络字节序再赋给socket,而不要假定主机字节序跟网络字节序一样使用的是Big-Endian。

htonl、htons、ntohl、ntohs

#include <arpa/inet.h>	//函数头文件uint32_t htonl(uint32_t hostlong);//32位的主机字节序转换到网络字节序
uint16_t htons(uint16_t hostshort);//16位的主机字节序转换到网络字节序
uint32_t ntohl(uint32_t netlong);//32位的网络字节序转换到主机字节序
uint16_t ntohs(uint16_t netshort);//16位的网络字节序转换到主机字节序

这里通过调用两个函数htons()htolnl()分别用来将 端口和IP地址转换成网络字节序;
这两个函数名中的 h表示host, n表示network, s表示short(2字节/16位), l表示long(4字节/32位)。
因为端口号16位的,所以我们用htons()把端口号从主机字节 序转换成网络字节序, 而IP地址32位的,所以我们用htonl()函数把IP地址从主机字节序转换成网络字节序
hostlongnetlong参数:可当作是4字节(32位)整数;
hostshortnetshort参数:可当作是2字节(16位)整数。

其它函数同理可得,这里不再赘述。

这里注意: uint8_t / uint16_t / uint32_t /uint64_t类型解释如下,如以了解,可自行忽略。
按照posix标准,一般整形对应的*_t类型为:

1字节     uint8_t
2字节     uint16_t
4字节     uint32_t
8字节     uint64_t

这些数据类型是 C99 中定义的,具体定义在:/usr/include/stdint.h ISO C99: 7.18 Integer types <stdint.h>

/* There is some amount of overlap with <sys/types.h> as known by inet code */
#ifndef __int8_t_defined
# define __int8_t_defined
typedef signed char             int8_t; 
typedef short int               int16_t;
typedef int                     int32_t;
# if __WORDSIZE == 64
typedef long int                int64_t;
# else
__extension__
typedef long long int           int64_t;
# endif
#endif/* Unsigned.  */
typedef unsigned char           uint8_t;
typedef unsigned short int      uint16_t;
#ifndef __uint32_t_defined
typedef unsigned int            uint32_t;
# define __uint32_t_defined
#endif
#if __WORDSIZE == 64
typedef unsigned long int       uint64_t;
#else
__extension__
typedef unsigned long long int  uint64_t;
#endif

inet_aton、inet_ntoa(IPv4)

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int inet_aton(const char *cp, struct in_addr *inp);//点分十进制字符串转换成网络字节序
char *inet_ntoa(struct in_addr in);	//网络字节序转换成点分十进制字符串

作用inet_aton()点分十进制IP地址转换为网络字节序IP地址存储在in_addr结构体当中;
cp参数:字符串常量(点分十进制IP地址)
inp参数:转换结果存储在IPv4结构体中;
函数成功执行则返回该网络字节序表示的无符号整数

作用inet_ntoa()网络字节序IP地址转换为点分十进制IP地址
in参数:IPv4结构体当中IP地址;
函数成功指向则返回指向点分十进制字符串指针

注意:对inet_aton()的调用传递的是指向结构体的指针,而对inet_ntoa()的调用传递的是结构体本身

inet_pton、inet_ntop(IPv4与IPv6)

#include <arpa/inet.h>int inet_pton(int family, const char *strptr, void *addrptr);
const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len);

功能inet_pton()函数用于将文本字符串转换成网络字节序的二进制地址;
family参数:AF_INET(ipv4)、AF_INET6(ipv6);
strptr参数:指针指向等待转换的字符串;
addrptr参数:转换成功的二进制结果;
若成功则返回值为1,否则如果所指定的family而言输入字符串不是有效的表达式格式,那么返回值为0。

功能inet_ntop()函数用于将网络字节序的二进制地址转换成文本字符串;
family参数:AF_INET(ipv4)、AF_INET6(ipv6);
strptr参数:指针指向等待转换的字符串,不可以是一个空指针;
addrptr参数:转换成功的二进制结果;
调用者必须为目标存储单元分配内存并指定其大小,调用成功时,这个指针就是该函数的返回值。
len参数:目标 存储单元的大小,以免该函数溢出其调用者的缓冲区。如果len太小,不足以容纳表达式结果,那么返回一个空指针,并置为errno为ENOSPC。

这篇关于htons/ntohs、inet_aton/inet_ntoa、inet_pton/inet_ntop函数详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843896

相关文章

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

MySQL数据库中ENUM的用法是什么详解

《MySQL数据库中ENUM的用法是什么详解》ENUM是一个字符串对象,用于指定一组预定义的值,并可在创建表时使用,下面:本文主要介绍MySQL数据库中ENUM的用法是什么的相关资料,文中通过代码... 目录mysql 中 ENUM 的用法一、ENUM 的定义与语法二、ENUM 的特点三、ENUM 的用法1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹