Linux网络字节序/IP地址转换

网络字节序:

大(高)端字节序(网络字节序):低位地址存放高位数据,高位地址存放低位数据

小(低)端字节序(主机字节序):低位地址存放低位数据,高位地址存放高位数据

在网络中需要考虑大小端的是IP和端口。

可以通过编写以下代码查看自己的电脑的字节序种类:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
union 
{
	short s;
	char c[sizeof(short)];
}un2;
union
{
	int s;
	char c[sizeof(int)];
}un4;
int main()
{
	un2.s=0x0102;
	printf("[%d],[%d],[%d]\n",un2.c[0],un2.c[1],un2.s);
	un4.s=0x01020304;
	printf("[%d],[%d],[%d],[%d],[%d]\n",un4.c[0],un4.c[1],un4.c[2],un4.c[3],un4.s);
	return 0;
}

可以看出是低端字节序 

网络传输用的是大端法,如果机器用的是小端法,则需要进行大小端的转换。

下面函数可以进行大小端转换:

 #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);//网络字节序转换为主机字节序daunting整型

 IP地址转换函数:

p->表示点分十进制的字符串形式

to->到

n->表示network网络

int inet_pton(int af, const char *src, void *dst);

函数说明:将字符串形式的点分十进制IP转换为大端模式的网络IP(整形四字节)

  • 参数:af:AF_INEF
  • src:字符串形式的点分十进制的IP地址
  • dst:存放转换网络IP变量的地址

例如:inet_pton(AF_INEF,"128.0.0.1",&addr);

十进制转十六进制:128->0x80 0->0x00  0->0x00 1->0x01

最后按大端字节序存放:0x01000080,这个就是四字节的整形

 const char *inet_ntop(int af, const void *src,
                             char *dst, socklen_t size);

函数说明:网络IP转换为点分十进制的IP

  • src:网络的整形的IP地址
  • dst:转换后的IP地址,一般为字符串数组
  • size:dst的长度,一般为16
  • 返回值:成功返回指向dst的指针;
  • 失败返回NULL,并设置error;

例如:IP地址:010aa8c0,转换为点分十进制:

01->1  0a->10 a8->168 c0->192;

由于网络的IP地址是高端模式,所以转换为192.168.10.1;

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落落落sss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值