分享免费的编程资源和教程

网站首页 > 技术教程 正文

【Linux网络编程】网络字节序和地址转换

goqiw 2024-09-04 18:45:00 技术教程 14 ℃ 0 评论

01. 主机序到网络序转换函数

相关函数

#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);

h表示主机序

n表示网络序

s表示short类型

l表示long类型

htonl函数

uint32_t htonl(uint32_t hostint32);

功能:

将 32 位主机字节序数据转换成网络字节序数据

参数:

hostint32:需要转换的 32 位主机字节序数据,uint32_t 为 32 为无符号整型

返回值:

成功:返回网络字节序的值

htons函数

uint16_t htons(uint16_t hostint16);

功能:

将 16 位主机字节序数据转换成网络字节序数据

参数:

hostint16:需要转换的 16 位主机字节序数据,uint16_t,unsigned short int

返回值:

成功:返回网络字节序的值

测试程序:

#include <stdio.h>

#include <arpa/inet.h>


int main(int argc, char *argv[])

{

int a = 0x01020304;

short int b = 0x0102;


printf("htonl(0x%08x) = 0x%08x\n", a, htonl(a));

printf("htons(0x%04x) = 0x%04x\n", b, htons(b));


return 0;

}

测试结果:

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ gcc 1.c

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ ./a.out

htonl(0x01020304) = 0x04030201

htons(0x0102) = 0x0201

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$

02. 网络序到主机序转换函数

ntohl函数

uint32_t ntohl(uint32_t netint32);

功能:

将 32 位网络字节序数据转换成主机字节序数据

参数:

netint32:待转换的 32 位网络字节序数据,uint32_t,unsigned int

返回值:

成功:返回主机字节序的值

ntohs函数

uint16_t ntohs(uint16_t netint16);

功能:

将 16 位网络字节序数据转换成主机字节序数据

参数:

netint16:待转换的 16 位网络字节序数据,uint16_t,unsigned short int

返回值:

成功:返回主机字节序的值

测试代码:

#include <stdio.h>

#include <arpa/inet.h>


int main(int argc, char *argv[])

{

int a = 0x01020304;

short int b = 0x0102;


printf("ntohl(0x%08x) = 0x%08x\n", a, ntohl(a));

printf("ntohs(0x%04x) = 0x%04x\n", b, ntohs(b));


return 0;

}

测试结果:

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ gcc 1.c

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ ./a.out

ntohl(0x01020304) = 0x04030201

ntohs(0x0102) = 0x0201

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$

03. inet_pton函数

inet_pton函数

#include <arpa/inet.h>

int inet_pton(int family, const char *strptr, void *addrptr);

功能:

将点分十进制数串转换成 32 位无符号整数

参数:

family:协议族( AF_INET、AF_INET6、PF_PACKET 等 ),常用 AF_INET

strptr:点分十进制数串

addrptr:32 位无符号整数的地址

返回值:

成功返回1

失败返回其它

测试代码:

#include <stdio.h>

#include <arpa/inet.h>

int main()

{

char ip_str[]="192.168.12.133";

unsigned int ip_uint = 0;

unsigned char *ip_p = NULL;


inet_pton(AF_INET,ip_str,&ip_uint);

printf("in_uint = %#x\n",ip_uint);


ip_p = (char *)&ip_uint;

printf("in_uint = %d,%d,%d,%d\n",*ip_p,*(ip_p+1),*(ip_p+2),*(ip_p+3));


return 0;

}

测试结果:

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ gcc 1.c

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ ./a.out

in_uint = 0x850ca8c0

in_uint = 192,168,12,133

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$

04. inet_ntop函数

const char *inet_ntop( int family, const void *addrptr, char *strptr, size_t len );

功能:

将 32 位无符号整数转换成点分十进制格式的字符串

参数:

family:协议族( AF_INET、AF_INET6、PF_PACKET 等 ),常用 AF_INET

addrptr:32 位无符号整数

strptr:点分十进制数串

len:strptr 缓存区长度

len 的宏定义

#define INET_ADDRSTRLEN 16 // for ipv4

#define INET6_ADDRSTRLEN 46 // for ipv6

返回值:

成功:则返回字符串的首地址

失败:返回 NULL

测试代码:

#include <stdio.h>

#include <arpa/inet.h>

int main()

{

unsigned char ip[] = {192, 168, 12, 133};

char ip_str[16] = "\0";


inet_ntop(AF_INET,(unsigned int *)ip,ip_str,16);

printf("ip_str = %s\n",ip_str);


return 0;

}

测试结果:

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ gcc 1.c

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$ ./a.out

ip_str = 192.168.12.133

deng@itcast:/mnt/hgfs/LinuxHome/code.bak2$

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表