参考该文

IP地址本地字节序的转换函数有以下几种:

1、uint32_t htonl(uint32_t hostlong);  //一般不用来转换ip地址

这个函数是int转int型,而我们习惯用的ip的是点分十进制的字符串。

用起来不方便,(因为,需要先将点分十进制-转换成uint32_t,然后再调用htonl()函数)

所以,此函数多数用来将32位(4字节整型)进行字节序转换。

ps:

INADDR_ANY,当不指定ip地址时,可以直接用该宏定义,最简单。

addr.sin_addr.s_addr = htonl(INADDR_ANY);//自动获取当前网卡的有效ip地址

2、int inet_pton(int af,const char*src,void*dst);  //经常用这个函数点分十进制字符串ip转换为网络字节序。

//示例
char *ip ="192.168.1.1";
char *port = "8000";
struct sockaddr_in addr;
addr.sinfamily = AF_INET;    // 或AFINET6
addr.sin_port = htons(atoi(port));inet_pton(AF_INET,ip,&addr.sin_addr);

同样,如果需要从网络字节序转换到主机字节序

使用 const char* inet_ntop(int af,const void *src,char *dst,socklen_t size);------->直接会转换成点分十进制字符串。

dst为转换后的点分十进制字符串;size为dst的大小

//示例
char str[sizeof(in_addr)];
ptr = inet_ntop(AF_INET, &foo.sin_addr, str, sizeof(str));

由附录5中可以看出,inet_ntop的第二个参数为指向 struct in_addr的结构体指针。

3、inet_addr()函数  //已经废弃,不推荐使用

//示例
char *ip ="192.168.1.1";
char *port = "8000";
struct sockaddr_in addr;
addr.sinfamily = AF_INET;    // 或AFINET6
addr.sin_port = htons(atoi(port));addr.sin_addr.s_addr = inet_addr(ip);    

4、总结:共有以上三种方式来将IP地址进行网络字节序转换。

写程序时,一般选择前2种形式:

1)addr.sin_addr.s_addr = htonl(INADDR_ANY);

2)inet_pton(AF_INET,ip,&addr.sin_addr);

注意:inet_pton的第3个参数带入的是in_addr结构体指针,而不是&addr.sin_addr.s_addr,因为从5附录中可以看出,dst必须是sizeof(struct in_addr)bytes long的,所以,推测该参数应为&addr.sin_addr

5、附录:

struct sockaddr_in{

sa_family_t sin_family;//地址族协议

in_port_t sin_port;//端口号

struct in_addr sin_addr;//ip地址

};

struct in_addr{

uint32_t s_addr;

};

IP地址本地字节序与网络字节序的转换函数相关推荐

  1. 网络编程-IP地址、端口号、网络字节序

    IP地址.端口号.网络字节序 本文中部分名词可见: 协议.TCP/IP模型.数据包封装与分用 一.IP地址 1. 简单认识 IP协议有两个版本:IPv4和IPv6. (1)IP地址在IP协议中,用来标 ...

  2. IP地址、端口号、网络字节序

    本文中部分名词可见: 协议.TCP/IP模型.数据包封装与分用 一.IP地址 1. 简单认识 IP协议有两个版本:IPv4和IPv6. (1)IP地址在IP协议中,用来标识网络中不同主机的地址. (2 ...

  3. 本地字节序与网络字节序的相互转换(IP地址、端口号)

    一般数据在内存中是按照字节存储的,存储的方式分为大端和小端.在不知道对方主机的存储方式的情况下,我们不知道是否需要转换数据的存储方式.因此,TCP/IP协议规定:发送到网络的数据流应采用大端字节序! ...

  4. 本地字节序和网络字节序

    本地字节序和网络字节序 字节序指不同的CPU访问内存中多字节数据的时候,存在大小端的问题,并且一定是访问多字节数据的时候才会存在大小端的问题,如果CPU访问的是字符串,则不存在大小端的问题: 那么如何 ...

  5. 本地字节序和网络字节序的转换

    1.背景 "端口号"或者"点分十进制的IP"必须先转化为"网络字节序",才能在网络环境中传输. TCP/IP 规定,网络数据流采用大端字节序 ...

  6. 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs【转】

    (转自:https://blog.csdn.net/kulala082/article/details/53431473) Part 1: htons函数具体解释 在Linux和Windows网络编程 ...

  7. Linux---主机字节序与网络字节序

    现在的CPU累加器一次能够装载至少4个字节的一个整数,那么字节在内存中的排列顺序不同,导致累加器使用的结果不同,这就是字节序问题 . 例如: 我们存储一个int类型的数字:int a = 1; 主机字 ...

  8. 什么是字节序(端序、低端字节序、高端字节序、网络字节序)

    前言 一个内容为12(字符串)的文本文件,它的第一个字节是什么(小端序)?如果你的回答是0x32,那你真的应该好好理解下字节序了.如下图所示,我这里的正确答案是0x31.当然如果你的回答是不一定,这似 ...

  9. 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs

    Part 1: htons函数具体解释      在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 i ...

最新文章

  1. 价值1143元的《R语言统计分析微生物组数据(Statistical Analysis of Microbiome Data with R)》系列图书
  2. Python: max和min函数的高级使用
  3. WEB API:语音识别
  4. java jar killed_容器中Java 程序OOMKilled原因浅析
  5. poj 2777(线段树的节点更新策略)
  6. CSS 实现行内和上下自适应的几种方法
  7. 1.4.1 启动与销毁Activity
  8. 基于Python-turtle库绘制小猪佩奇、小猫咪
  9. 数独超难题目_号称世界上最难的一道数独题,你敢来挑战吗?据说答案只有一种...
  10. 身份证省市区SQL代码
  11. ubuntu 18.04 安装 wine5.0
  12. EXCEL 数据比对查询好用的指令——VLOOKUP 三种使用场景
  13. Java 编程实例 - 查找数组中的重复元素
  14. 离线RSS浏览FeedDemon
  15. JavaEE Spring框架学习笔记(AOP Introductions介绍)
  16. UITextView 首行缩进
  17. 信用卡逾期别慌,有的逾期记录可撤销
  18. 《Linux运维总结:find命令高级用法详解》
  19. SAP系统 - ABAVN固定资产报废解析之完全报废案例
  20. bootstrap中怎么样使按钮居中

热门文章

  1. 中国刑事警察学院计算机中心,中国刑事警察学院计算机犯罪侦查系介绍
  2. u盘安装centos 5.11
  3. kodi教程 linux,Kodi v17 “Krypton” Alpha 2发布及在Ubuntu 16.04中安装
  4. 【2012用户大会-遥感讲座分享】ENVI/IDL在地理国情监测中的解决方案
  5. 把token放在vuex
  6. web微博系统(前端)
  7. [转] 适合儿童上手的八款编程工具
  8. 以监工高管为代表的资本资产化
  9. vue-awesome-swiper插件
  10. (5)美团面试题:HashMap1.7是如何形成死循环的(头插法导致的)?(最完整的配图讲解)