1385|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

网络字节序和地址转换 [复制链接]

字节序转换函数

#include

uint16_t htons(uint16_t host16bitvalue)   //返回网络字节序的值
uint32_t htonl(uint32_t host32bitvalue)   //返回网络字节序的值

uint16_t ntohs(uint16_t net16bitvalue)    //返回主机字节序的值
uint32_t ntohl(uint32_t net32bitvalue)    //返回主机字节序的值
上述函数中,h代表host,n代表network,s代表short,l代表short;
当使用这些函数时,我们并不关心主机字节序和网络字节序的真实值,只要调用适当的函数在主机和网络字节序之间转换某个给定的值,因为在那些与网络字节序(大端字节序)相同的系统中,这些函数为空,如下代码:

#ifdef __OPTIMIZE__
/* We can optimize calls to the conversion functions.  Either nothing has
    to be done or we are using directly the byte-swapping functions which
    often can be inlined.  */
# if __BYTE_ORDER == __BIG_ENDIAN
/* The host byte order is the same as network byte order,
    so these functions are all just identity.  */
# define ntohl(x)   (x)
# define ntohs(x)   (x)
# define htonl(x)   (x)
# define htons(x)   (x)
# else
#  if __BYTE_ORDER == __LITTLE_ENDIAN
#   define ntohl(x) __bswap_32 (x)
#   define ntohs(x) __bswap_16 (x)
#   define htonl(x) __bswap_32 (x)
#   define htons(x) __bswap_16 (x)
#  endif
# endif
#endif  
如果主机系统的字节序为大端模式,这些函数定义为空,在进行socket编程的时候,为了提高代码的可移植性,应该总是使用这些函数进行主机字节序和网络字节序的处理;

函数使用举例:

#include
#include

int main(int argc,char **argv)
{
        int value1 = 0x12345678;          //定义一个4字节的数据
        short int value2 = 0x1234;        //定义一个2字节的数据
        printf("htonl(0x%08x) = 0x%08x\r\n",value1,htonl(value1));
        printf("htons(0x%04x) = 0x%04x\r\n",value2,htons(value2));
}
代码执行如下:


地址转换函数

使用协议无关性的两个地址处理函数,函数如下:

#include

//返回:若成功返回1,若输入不是有效的表达格式返回0,出错返回-1
int inet_pton(int family,const char *strptr, void *addrptr);

//返回:若成功则为指向结果的指针,若出错则为NULL
const char *inet_ntop(int family,const void *addrptr,char *strptr,size_t len);
函数使用举例:
#include
#include

int main(int argc,char **argv)
{
        unsigned char address[4];   //存放ip地址
        char str[INET_ADDRSTRLEN] = {0};
        char *string = NULL;
       
        string = "192.168.1.1";
        inet_pton(AF_INET,string,address);
        printf("%d %d %d %d\r\n",address[0],address[1],address[2],address[3]);

        address[0] = 127;address[1] = 127;address[2] = 33;address[3] = 33;
        inet_ntop(AF_INET,address,str,16);
        printf("%s\r\n",str);

        return 0;
}


 
点赞 关注(1)

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表