IP地址本地字节序与网络字节序的转换函数
参考该文
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地址本地字节序与网络字节序的转换函数相关推荐
- 网络编程-IP地址、端口号、网络字节序
IP地址.端口号.网络字节序 本文中部分名词可见: 协议.TCP/IP模型.数据包封装与分用 一.IP地址 1. 简单认识 IP协议有两个版本:IPv4和IPv6. (1)IP地址在IP协议中,用来标 ...
- IP地址、端口号、网络字节序
本文中部分名词可见: 协议.TCP/IP模型.数据包封装与分用 一.IP地址 1. 简单认识 IP协议有两个版本:IPv4和IPv6. (1)IP地址在IP协议中,用来标识网络中不同主机的地址. (2 ...
- 本地字节序与网络字节序的相互转换(IP地址、端口号)
一般数据在内存中是按照字节存储的,存储的方式分为大端和小端.在不知道对方主机的存储方式的情况下,我们不知道是否需要转换数据的存储方式.因此,TCP/IP协议规定:发送到网络的数据流应采用大端字节序! ...
- 本地字节序和网络字节序
本地字节序和网络字节序 字节序指不同的CPU访问内存中多字节数据的时候,存在大小端的问题,并且一定是访问多字节数据的时候才会存在大小端的问题,如果CPU访问的是字符串,则不存在大小端的问题: 那么如何 ...
- 本地字节序和网络字节序的转换
1.背景 "端口号"或者"点分十进制的IP"必须先转化为"网络字节序",才能在网络环境中传输. TCP/IP 规定,网络数据流采用大端字节序 ...
- 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs【转】
(转自:https://blog.csdn.net/kulala082/article/details/53431473) Part 1: htons函数具体解释 在Linux和Windows网络编程 ...
- Linux---主机字节序与网络字节序
现在的CPU累加器一次能够装载至少4个字节的一个整数,那么字节在内存中的排列顺序不同,导致累加器使用的结果不同,这就是字节序问题 . 例如: 我们存储一个int类型的数字:int a = 1; 主机字 ...
- 什么是字节序(端序、低端字节序、高端字节序、网络字节序)
前言 一个内容为12(字符串)的文本文件,它的第一个字节是什么(小端序)?如果你的回答是0x32,那你真的应该好好理解下字节序了.如下图所示,我这里的正确答案是0x31.当然如果你的回答是不一定,这似 ...
- 主机字节序与网络字节序的转换函数:htonl、ntohl、htons、ntohs
Part 1: htons函数具体解释 在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 i ...
最新文章
- 价值1143元的《R语言统计分析微生物组数据(Statistical Analysis of Microbiome Data with R)》系列图书
- Python: max和min函数的高级使用
- WEB API:语音识别
- java jar killed_容器中Java 程序OOMKilled原因浅析
- poj 2777(线段树的节点更新策略)
- CSS 实现行内和上下自适应的几种方法
- 1.4.1 启动与销毁Activity
- 基于Python-turtle库绘制小猪佩奇、小猫咪
- 数独超难题目_号称世界上最难的一道数独题,你敢来挑战吗?据说答案只有一种...
- 身份证省市区SQL代码
- ubuntu 18.04 安装 wine5.0
- EXCEL 数据比对查询好用的指令——VLOOKUP 三种使用场景
- Java 编程实例 - 查找数组中的重复元素
- 离线RSS浏览FeedDemon
- JavaEE Spring框架学习笔记(AOP Introductions介绍)
- UITextView 首行缩进
- 信用卡逾期别慌,有的逾期记录可撤销
- 《Linux运维总结:find命令高级用法详解》
- SAP系统 - ABAVN固定资产报废解析之完全报废案例
- bootstrap中怎么样使按钮居中
热门文章
- 中国刑事警察学院计算机中心,中国刑事警察学院计算机犯罪侦查系介绍
- u盘安装centos 5.11
- kodi教程 linux,Kodi v17 “Krypton” Alpha 2发布及在Ubuntu 16.04中安装
- 【2012用户大会-遥感讲座分享】ENVI/IDL在地理国情监测中的解决方案
- 把token放在vuex
- web微博系统(前端)
- [转] 适合儿童上手的八款编程工具
- 以监工高管为代表的资本资产化
- vue-awesome-swiper插件
- (5)美团面试题:HashMap1.7是如何形成死循环的(头插法导致的)?(最完整的配图讲解)