ntohs, ntohl, htons,htonl的比较和详解
stm32大小端转换函数

STM32大小端转换函数在介绍STM32大小端转换函数之前,首先我们需要了解什么是大小端(Endianness)。
什么是大小端(Endianness)?在计算机系统中,字节序(Byte Order)是指多字节数据在内存中存储时的顺序。
由于内存以字节为单位进行组织,因此多字节数据(如整数、浮点数等)在内存中存储时需要按照某种顺序进行排列。
常见的字节序有两种,分别是大端序(Big-endian)和小端序(Little-endian)。
•大端序:将高位字节存储在低地址,低位字节存储在高地址。
例如,十六进制整数0x12345678在大端序存储中为0x12 0x34 0x56 0x78。
•小端序:将低位字节存储在低地址,高位字节存储在高地址。
例如,十六进制整数0x12345678在小端序存储中为0x78 0x56 0x34 0x12。
不同的处理器架构使用的字节序可能不同,因此在进行数据交换或者跨平台通信时,需要进行大小端的转换。
STM32大小端转换函数在STM32系列的微控制器中,提供了一些用于进行大小端转换的特定函数。
这些函数可以帮助开发人员在不同的字节序之间进行转换,以满足特定的需求。
STM32大小端转换函数主要包括以下几个:1.htons():将16位(2字节)主机字节顺序转换为网络字节顺序(大端序)。
2.htonl():将32位(4字节)主机字节顺序转换为网络字节顺序(大端序)。
3.ntohs():将16位(2字节)网络字节顺序(大端序)转换为主机字节顺序。
4.ntohl():将32位(4字节)网络字节顺序(大端序)转换为主机字节顺序。
下面分别详细介绍这几个函数的定义、用途和工作方式。
1. htons()函数定义:uint16_t htons(uint16_t hostshort);用途:htons()函数用于将16位主机字节顺序的数据转换为网络字节顺序(大端序)的数据。
工作方式:htons()函数接受一个参数hostshort,该参数是一个16位的整数,表示主机字节顺序的数据。
c语言中结构体中如何规避大端小端问题的方法

c语言中结构体中如何规避大端小端问题的方法【摘要】在C语言中,结构体中的数据在不同大小端系统中可能会出现字节序问题。
为了规避这个问题,可以采取多种方法。
可以使用统一的字节序,即在定义结构体时按照某种规定的顺序排列成员变量。
可以使用位域来手动指定每个成员变量的字节排列顺序。
也可以使用网络字节序函数来统一处理字节序转换。
手动转换字节序和使用联合体也都是解决大端小端问题的有效方法。
通过选择合适的方法,可以在C 语言中避免结构体中的大端小端问题,确保数据在不同系统中的正确传输和解析。
【关键词】引言, 背景介绍, 使用统一的字节序, 使用位域, 使用网络字节序函数, 使用手动转换字节序, 使用联合体, 总结1. 引言1.1 背景介绍在计算机系统中,数据通常以字节序列的形式存储和传输。
不同系统的字节序可能会有所不同,主要分为大端和小端两种类型。
大端表示数据的高位字节存储在内存的低地址处,而小端则相反,高位字节存储在高地址处。
在C语言中,结构体是一种用于存储相关数据的数据类型,它的成员在内存中是按照定义的顺序依次存储的。
当结构体中包含多字节数据类型的成员时,可能会涉及到大端小端问题。
如果不加以处理,将会导致在不同字节序系统中出现数据错误的情况。
为了规避大端小端问题,我们可以采取一些方法来确保数据在不同系统之间的兼容性。
这些方法包括使用统一的字节序、使用位域、使用网络字节序函数、使用手动转换字节序以及使用联合体等。
通过正确选择和应用这些方法,我们可以有效地处理结构体中的大端小端问题,确保数据的正确传输和存储。
2. 正文2.1 使用统一的字节序在C语言中,结构体中的成员在不同平台上可能会出现大端小端问题。
为了规避这个问题,我们可以使用统一的字节序来确定结构体中成员的存储顺序。
一种简单的方法是在定义结构体时按照特定的顺序排列成员,这样就可以避免不同平台上字节序的差异。
可以按照从高位到低位的顺序排列成员,确保在任何平台上都能正确地存储和读取数据。
大头小头字节序网络字节序与主机字节序

大头小头字节序:网络字节序与主机字节序不同的CPU有不同的字节序类型这些字节序是指整数在内存中保存的顺序这个叫做主机序最常见的有两种1.Little endian(小头):将低序字节存储在起始地址2.Big endian(大头):将高序字节存储在起始地地址LE little-endian最符合人的思维的字节序地址低位存储值的低位地址高位存储值的高位怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说低位值小,就应该放在内存地址小的地方,也即内存地址低位反之,高位值就应该放在内存地址大的地方,也即内存地址高位BE big-endian最直观的字节序地址低位存储值的高位地址高位存储值的低位为什么说直观,不要考虑对应关系只需要把内存地址从左到右按照由低到高的顺序写出把值按照通常的高位到低位的顺序写出两者对照,一个字节一个字节的填充进去例子:在内存中双字0x01020304(DWORD)的存储方式内存地址4000 4001 4002 4003LE 04 03 02 01BE 01 02 03 04例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为big-endian little-endian0x00000x12 0xcd0x00010x23 0xab0x00020xab 0x340x00030xcd 0x12x86系列C P U都是l ittle-endian的字节序.网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的C PU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。
网络字节顺序采用big endian排序方式。
为了进行转换bsd socket提供了转换的函数有下面四个htons把unsig ned short类型从主机序转换到网络序htonl把unsig ned long类型从主机序转换到网络序ntohs把unsig ned short类型从网络序转换到主机序ntohl把unsig ned long类型从网络序转换到主机序在使用lit tle endian的系统中这些函数会把字节序进行转换在使用big endian类型的系统中这些函数会定义成空宏同样在网络程序开发时或是跨平台开发时也应该注意保证只用一种字节序不然两方的解释不一样就会产生bu g.注:1、网络与主机字节转换函数:htonsntohshtonl ntohl (s 就是short l是long h是host n是net w o rk)2、不同的CPU上运行不同的操作系统,字节序也是不同的,参见下表。
linux 大端小端转换函数

linux 大端小端转换函数Linux 大端小端转换函数在计算机中,数据的存储方式有两种:大端模式和小端模式。
大端模式是指数据的高位字节存储在内存的低地址处,而小端模式则是指数据的低位字节存储在内存的低地址处。
在不同的计算机体系结构中,可能会采用不同的存储方式,因此在进行数据传输时,需要进行大小端转换。
在Linux 中,提供了一些函数来进行大小端转换,包括htons、htonl、ntohs 和ntohl。
这些函数可以将数据从主机字节序转换为网络字节序或从网络字节序转换为主机字节序。
htons 函数用于将一个 16 位的主机字节序转换为网络字节序。
其函数原型如下:```c#include <arpa/inet.h>uint16_t htons(uint16_t hostshort);```其中,hostshort 表示要转换的 16 位主机字节序。
该函数返回一个16 位的网络字节序。
htonl 函数用于将一个 32 位的主机字节序转换为网络字节序。
其函数原型如下:```c#include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);```其中,hostlong 表示要转换的32 位主机字节序。
该函数返回一个32 位的网络字节序。
ntohs 函数用于将一个 16 位的网络字节序转换为主机字节序。
其函数原型如下:```c#include <arpa/inet.h>uint16_t ntohs(uint16_t netshort);```其中,netshort 表示要转换的16 位网络字节序。
该函数返回一个16 位的主机字节序。
ntohl 函数用于将一个 32 位的网络字节序转换为主机字节序。
其函数原型如下:```c#include <arpa/inet.h>uint32_t ntohl(uint32_t netlong);```其中,netlong 表示要转换的32 位网络字节序。
字节顺序转换函数

字节顺序转换函数字节顺序转换函数是计算机编程中的一个重要工具,它能够在不同字节序之间进行转换,通常用于网络编程和二进制数据的处理。
本文将介绍字节顺序的概念、为什么需要字节顺序转换以及常用的字节顺序转换函数。
字节顺序是指在多字节数据类型中,每个字节的排列顺序。
在计算机中,有两种主要的字节序:大端字节序和小端字节序。
大端字节序(也称为网络字节序)是指将高位字节排在前面,低位字节排在后面的顺序。
而小端字节序则是将低位字节排在前面,高位字节排在后面。
例如,十进制数字12345678在大端字节序中表示为0x12 0x34 0x56 0x78,在小端字节序中则表示为0x78 0x56 0x34 0x12。
为什么需要字节顺序转换呢?主要原因是网络通信和不同平台之间数据的交互。
在网络通信中,数据必须按照一定的字节序传输,例如TCP/IP协议规定使用大端字节序。
如果两个计算机使用的字节序不同,就需要进行字节顺序转换。
另外,不同平台的CPU架构也可能导致字节序不同,因此在数据交互时也需要进行字节顺序转换。
常用的字节顺序转换函数包括htons、htonl、ntohs和ntohl。
其中,htons和htonl分别用于将16位和32位无符号整数从主机字节序转换为网络字节序;ntohs和ntohl则是将网络字节序转换为主机字节序。
下面是一个示例代码:```c#include <arpa/inet.h>#include <stdio.h>int main() {uint16_t n = 0x1234; // 主机字节序uint16_t m = htons(n); // 转换为网络字节序printf('n = 0x%x, m = 0x%x', n, m);uint32_t x = 0x12345678; // 主机字节序uint32_t y = htonl(x); // 转换为网络字节序printf('x = 0x%x, y = 0x%x', x, y);uint16_t p = ntohs(m); // 转换为主机字节序uint32_t q = ntohl(y); // 转换为主机字节序printf('p = 0x%x, q = 0x%x', p, q);return 0;}```在代码中,我们先定义了两个变量n和x,分别表示16位和32位无符号整数的值。
htonl、ntohl、htons、ntohs函数实现

htonl、ntohl、htons、ntohs函数实现typedef unsigned short int uint16;typedef unsigned long int uint32;//短整型⼤⼩端互换#define BigLittleSwap16(A) ((((uint16)(A) & 0xff00) >> 8) | \(((uint16)(A) & 0x00ff) << 8))//长整型⼤⼩端互换#define BigLittleSwap32(A) ((((uint32)(A) & 0xff000000) >> 24) | \(((uint32)(A) & 0x00ff0000) >> 8) | \(((uint32)(A) & 0x0000ff00) << 8) | \(((uint32)(A) & 0x000000ff) << 24))//本机⼤端返回1,⼩端返回0int checkCPUendian(){union{unsigned long int i;unsigned char s[4];}c;c.i = 0x12345678;return(0x12 == c.s[0]);}//模拟htonl函数,本机字节序转⽹络字节序unsigned long int t_htonl(unsigned long int h){//若本机为⼤端,与⽹络字节序同,直接返回//若本机为⼩端,转换成⼤端再返回return checkCPUendian() ? h :BigLittleSwap32(h);}//模拟ntohl函数,⽹络字节序转本机字节序unsigned long int t_ntohl(unsigned long int n){//若本机为⼤端,与⽹络字节序同,直接返回//若本机为⼩端,⽹络数据转换成⼩端再返回return checkCPUendian() ? n :BigLittleSwap32(n);}//模拟htons函数,本机字节序转⽹络字节序unsigned short int t_htons(unsigned short int h){//若本机为⼤端,与⽹络字节序同,直接返回//若本机为⼩端,转换成⼤端再返回return checkCPUendian() ? h :BigLittleSwap16(h);}//模拟ntohs函数,⽹络字节序转本机字节序unsigned short int t_ntohs(unsigned short int n){//若本机为⼤端,与⽹络字节序同,直接返回//若本机为⼩端,⽹络数据转换成⼩端再返回return checkCPUendian() ? n :BigLittleSwap16(n); }。
Socket中常见的几个转换函数(htonl,htons,ntohl,ntohs,inet。。。
Socket中常见的⼏个转换函数(htonl,htons,ntohl,ntohs,inet。
Socket中常见的⼏个转换函数(htonl,htons,ntohl,ntohs,inet_addr,inet_ntoa) htonl() htons() ntohl() ntohs()及inet_ntoa() inet_addr()的⽤法 注:其中的h表⽰“host”,n表⽰“net”,l表⽰“long”, s表⽰“short”a表⽰“ascii”,ddr表⽰“in_addr结构体” 现在我们很幸运,因为我们有很多的函数来⽅便地操作 IP 地址。
没有必要⽤⼿⼯计算它们,也没有必要⽤"⼀个sockaddr_in结构体变量ina,你有⼀个IP地址"132.241.5.10" 要储存在其中,你就要⽤到函数inet_addr(),将IP地址从点数格式转换成⽆符号长整型。
使⽤⽅法如下: ina.sin_addr.s_addr = inet_addr("132.241.5.10"); 注意,inet_addr()返回的地址已经是⽹络字节格式,所以你⽆需再调⽤函数htonl()。
现在你可以将IP地址转换成长整型了。
有没有其相反的⽅法呢?它可以将⼀个in_addr结构体输出成点数格式?这样的话,你就要⽤到函数 inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样: printf("%s",inet_ntoa(ina.sin_addr)); 它将输出IP地址。
需要注意的是inet_ntoa()将结构体in-addr作为⼀个参数,不是长整形。
同样需要注意的是它返回的是⼀个指向⼀个字符的指针。
它是⼀个由inet_ntoa()控制的静态的固定的指针,所以每次调⽤ inet_ntoa(),它就将覆盖上次调⽤时所得的IP地址。
linux大小端转换函数
linux大小端转换函数
在Linux中,大小端转换函数是非常重要的。
因为在不同的硬件中,字节序可能是不同的,而对于数据的处理,字节序的问题也是必须要解决的。
在Linux中,提供了一些函数来进行大小端转换,主要包括以下几个:
1. htons和ntohs函数:用于16位的数据大小端转换,其中htons 是将主机字节序转换为网络字节序,ntohs是将网络字节序转换为主机字节序。
2. htonl和ntohl函数:用于32位的数据大小端转换,其中htonl 是将主机字节序转换为网络字节序,ntohl是将网络字节序转换为主机字节序。
这些函数的使用非常简单,只需要将需要转换的数据传入函数中即可。
例如,将一个16位的数值从主机字节序转换为网络字节序,可以使用如下代码:
unsigned short value = 1234;
unsigned short network_value = htons(value);
这样就可以将value转换为网络字节序后,存储到
network_value中。
总之,在Linux中,大小端转换函数是非常重要的,可以帮助我们正确地处理不同字节序的数据,避免数据出现错误。
因此,我们在编写程序时,一定要注意字节序的问题,并及时使用大小端转换函数进行转换。
VS2010 C++学习(4):WinSock域名查询解析程序
VS2010 C++学习(4):WinSock域名查询解析学习VC++编制的Socket域名查询、解析程序,主要练习网络Winsock的应用。
一、主要内容:1.根据IP地址查询主机信息;2.根据网址查询主机信息、DNS解析地址;二、设计实现:1.根据IP地址查询主机信息;根据IP地址调用gethostbyaddr函数,分析hostent结构体获取主机信息。
2.根据网址查询主机信息、DNS解析地址;根据网址调用getaddinfo函数查询DNS服务器,查询链表依次获取该网址的主机信息,分析SOCKADDR_IN结构体,解析出IP地址。
三、基础知识:(一)域名解析DNSR(domain name system resolution)1.域名解析域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站一种服务。
域名解析也叫域名指向、服务器设置、域名配置以及反向IP登记等等。
说得简单点就是将好记的域名解析成IP,服务由DNS服务器完成,是把域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定。
IP地址是网路上标识您站点的数字地址,为了方便记忆,采用域名来代替IP地址标识站点地址。
域名解析就是域名到IP地址的转换过程。
域名的解析工作由DNS服务器完成。
我们知道域名是为了方便记忆而专门建立的一套地址转换系统,要访问一台互联网上的服务器,最终还必须通过IP地址来实现,域名解析就是将域名重新转换为IP地址的过程。
一个域名对应一个IP地址,一个IP地址可以对应多个域名;所以多个域名可以同时被解析到一个IP地址。
域名解析需要由专门的域名解析服务器(DNS)来完成。
解析过程,比如,一个域名为:***.com,是想看到这个现HTTP服务,如果要访问网站,就要进行解析,首先在域名注册商那里通过专门的DNS服务器解析到一个WEB服务器的一个固定IP上:211.214.1.***,然后,通过WEB服务器来接收这个域名,把***.com 这个域名映射到这台服务器上。
高低字节序转换(htonl、ntohl、htons、ntohs函数)
高低字节序转换(htonl、ntohl、htons、ntohs函数)Part 1: htons函数具体解释在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序。
在Intel机器下,执行以下程序int main()...{printf("%d /n",htons(16));return 0;}得到的结果是4096,初一看感觉很怪。
解释如下,数字16的16进制表示为0x0010,数字4096的16进制表示为0x1000。
由于Intel机器是小尾端,存储数字16时实际顺序为1000,存储4096时实际顺序为0010。
因此在发送网络包时为了报文中数据为0010,需要经过htons进行字节转换。
如果用IBM 等大尾端机器,则没有这种字节顺序转换,但为了程序的可移植性,也最好用这个函数。
另外用注意,数字所占位数小于或等于一个字节(8 bits)时,不要用htons转换。
这是因为对于主机来说,大小尾端的最小单位为字节(byte)。
Part 2: 大小端模式不同的CPU有不同的字节序类型这些字节序是指整数在内存中保存的顺序这个叫做主机序最常见的有两种1. Little endian:将低序字节存储在起始地址2. Big endian:将高序字节存储在起始地址LE little-endian最符合人的思维的字节序地址低位存储值的低位地址高位存储值的高位怎么讲是最符合人的思维的字节序,是因为从人的第一观感来说低位值小,就应该放在内存地址小的地方,也即内存地址低位反之,高位值就应该放在内存地址大的地方,也即内存地址高位BE big-endian最直观的字节序地址低位存储值的高位地址高位存储值的低位为什么说直观,不要考虑对应关系只需要把内存地址从左到右按照由低到高的顺序写出把值按照通常的高位到低位的顺序写出两者对照,一个字节一个字节的填充进去例子:在内存中双字0x01020304(DWORD)的存储方式内存地址4000 4001 4002 4003LE 04 03 02 01BE 01 02 03 04例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为big-endian little-endian0x0000 0x12 0xcd0x0001 0x23 0xab0x0002 0xab 0x340x0003 0xcd 0x12x86系列CPU都是little-endian的字节序.网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ntohs, ntohl, htons,htonl的比较和详解在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题。
这时就可能用到htons(), ntohl(), ntohs(),htons()这4个网络字节顺序与本地字节顺序之间的转换函数:htonl()--"Host to Network Long int"32Bytesntohl()--"Network to Host Long int" 32Byteshtons()--"Host to Network Short int" 16Bytesntohs()--"Network to Host Short int" 16Bytes之所以需要这些函数是因为计算机数据表示存在两种字节顺序:NBO与HBO。
网络字节顺序NBO(Network Byte Order):按从高到低的顺序存储,在网络上使用统一的网络字节顺序,可以避免兼容性问题。
主机字节顺序(HBO,Host Byte Order):不同的机器HBO不相同,与CPU设计有关,数据的顺序是由cpu决定的,而与操作系统无关。
如Intel x86结构下,short型数0x1234表示为34 12, int型数0x12345678表示为78 56 34 12 。
如IBM power PC结构下,short型数0x1234表示为12 34, int型数0x12345678表示为12 34 56 78。
由于这个原因不同体系结构的机器之间无法通信,所以要转换成一种约定的数序,也就是网络字节顺序,其实就是如同power pc那样的顺序。
在PC开发中有ntohl和htonl函数可以用来进行网络字节和主机字节的转换。
在Linux系统下:htonl(),htons(), ntohl(), ntohs()的头文件及函数定义:#include <arpa/inet.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong);uint16_t ntohs(uint16_t netshort);在windows系统下:htonl(),htons(), ntohl(), ntohs(),inet_addr()使用说明ntohs() 简述:将一个无符号短整形数从网络字节顺序转换为主机字节顺序。
#include <winsock.h> u_short PASCAL FAR ntohs( u_short netshort); netshort:一个以网络字节顺序表达的16位数。
注释:本函数将一个16位数由网络字节顺序转换为主机字节顺序。
返回值:ntohs()返回一个以主机字节顺序表达的数。
ntohl() 简述:将一个无符号长整形数从网络字节顺序转换为主机字节顺序。
#include <winsock.h> u_long PASCAL FAR ntohl( u_long netlong); netlong:一个以网络字节顺序表达的32位数。
注释:本函数将一个32位数由网络字节顺序转换为主机字节顺序。
返回值:ntohl()返回一个以主机字节顺序表达的数。
htons() 简述:将主机的无符号短整形数转换成网络字节顺序。
//将无符号短整型主机字节序转换为网络字节序#include<winsock.h> u_short PASCAL FAR htons( u_short hostshort); hostshort:主机字节顺序表达的16位数。
注释:本函数将一个16位数从主机字节顺序转换成网络字节顺序。
返回值:htons()返回一个网络字节顺序的值。
简单地说,htons()就是将一个数的高低位互换(如:12 34 --> 34 12) VB表示: MsgBoxHex(htons(&H1234)) 显示值为3412htonl()简述:将主机的无符号长整形数转换成网络字节顺序。
//将无符号长整型网络字节序转换为主机字节序#include <winsock.h> u_long PASCAL FARhtonl( u_long hostlong); hostlong:主机字节顺序表达的32位数。
注释:本函数将一个32位数从主机字节顺序转换成网络字节顺序。
返回值:htonl()返回一个网络字节顺序的值。
inet_addr() 简述:将一个点间隔地址转换成一个in_addr。
#include <winsock.h> unsigned long PASCAL FAR inet_addr( const struct FAR* cp);cp:一个以Internet标准“.”间隔的字符串。
例如202.38.214.xx 当IP地址为255.255.255.255是被认为无效IP地址。
本函数解释cp参数中的字符串,这个字符串用Internet的“.”间隔格式表示一个数字的Internet地址。
返回值:一个无符号长整形数,可用作Internet地址。
所有Internet地址以网络字节顺序返回(字节从左到右排列)。
inet_ntoa() 简述:将网络地址转换成“.”点隔的字符串格式。
#include <winsock.h> char FAR* PASCAL FAR inet_ntoa( struct in_addr in);in:一个表示Internet主机地址的结构。
注释:本函数将一个用in参数所表示的Internet地址结构转换成以“.” 间隔的诸如“a.b.c.d”的字符串形式。
请注意inet_ntoa()返回的字符串存放在WINDOWS套接口实现所分配的内存中。
应用程序不应假设该内存是如何分配的。
在同一个线程的下一个WINDOWS套接口调用前,数据将保证是有效。
当IP地址为255.255.255.255是认为有效IP地址。
这是与inet_addr()的区别返回值:若无错误发生,inet_ntoa()返回一个字符指针。
否则的话,返回NULL。
其中的数据应在下一个WINDOWS套接口调用前复制出来。
inet_aton() 与inet_ntoa()作用相反。
inet_pton() 简述:本函数将点分十进制转换为整数#include<sys/types.h> #include <sys/socket.h>#include <arpa/inet.h> int inet_pton(int af, const char *src, void *dst); 这个函数转换字符串到网络地址,第一个参数af是地址族,转换后存在dst中inet_pton 是inet_addr的扩展,支持的多地址族有下列:af =AF_INET src为指向字符型的地址,即ASCII的地址的首地址(ddd.ddd.ddd.ddd格式的),函数将该地址转换为in_addr的结构体,并复制在*dst中af =AF_INET6 src为指向IPV6的地址,,函数将该地址转换为in6_addr的结构体,并复制在*dst中如果函数出错将返回一个负值,并将errno设置为EAFNOSUPPORT,如果参数af指定的地址族和src格式不对,函数将返回0。
#include<sys/types.h> #include <sys/socket.h>#include <arpa/inet.h> const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt); 这个函数转换网络二进制结构到ASCII类型的地址,参数的作用和上面相同,只是多了一个参数socklen_t cnt,他是所指向缓存区dst的大小,避免溢出,如果缓存区太小无法存储地址的值,则返回一个空指针,并将errno置为ENOSPCatoi()array to integer将字符串转换为整形数首先,假设你已经有了一个sockaddr_in结构体ina,你有一个IP地址"132.241.5.10" 要储存在其中,你就要用到函数inet_addr(),将IP地址从点数格式转换成无符号长整型。
使用方法如下:ina.sin_addr.s_addr =inet_addr("132.241.5.10");注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用函数htonl()。
我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。
显而易见,当inet_addr()发生错误时返回-1。
记住这些二进制数字?(无符号数)-1仅仅和IP地址255.255.255.255相符合!这可是广播地址!大错特错!记住要先进行错误检查。
好了,现在你可以将IP地址转换成长整型了。
有没有其相反的方法呢?它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样:printf("%s",inet_ntoa(ina.sin_addr));它将输出IP地址。
需要注意的是inet_ntoa()将结构体in-addr作为一个参数,不是长整形。
同样需要注意的是它返回的是一个指向一个字符的指针。
它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用inet_ntoa(),它就将覆盖上次调用时所得的IP 地址。
例如:char *a1, *a2;a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */printf("address 1: %s ",a1);printf("address 2: %s ",a2);输出如下:address 1: 132.241.5.10address 2: 132.241.5.10假如你需要保存这个IP地址,使用strcopy()函数来指向你自己的字符指针。