人们理解的IP地址表达方式类似为127.0.0.1,而计算机理解的为一串0x011111110000000…..的表达式。
因此,linux操作系统有一套函数用于网络地址的字符串形式和二进制形式转换
inet_XXX()函数,用于网络地址字符串和二进制形式之间的转换
因特网中IP地址(IP地址分类,网络ID,主机ID组成)
主机ID各位(位指的是二进制位)全为1的IP地址用作广播(如192.168.1.255)
IP地址分类(A,B,C,D,E类)
先介绍两个名词
大端字节序:表示内存地址的起始地址存放高字节(网络字节序默认大端字节序)
小端字节序:表示内存地址的起始地址存放低字节
参考大端字节序和小端字节序
例子:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
int main()
{
char ip[] = "192.168.1.11";
long r1, r2, r3; //long
struct in_addr addr;
r1 = inet_addr(ip); //返回网络字节序
if(-1 == r1){
printf("inet_addr return -1\n");
}else{
printf("inet_addr ip: 0x%x\n", r1);
}
r2 = inet_network(ip); //返回主机字节序
if(-1 == r2){
printf("inet_addr return -1\n");
}else{
printf("inet_network ip: 0x%x\n", r2);
printf("inet_network ip: 0x%x\n", htonl(r2)); // 主机字节序 ——> 网络字节序
}
r3 = inet_aton(ip, &addr); //返回网络字节序
if(0 == r3){
printf("inet_aton error!\n");
}else{
printf("inet_aton ip: 0x%x\n", addr.s_addr);
}
输出:
inet_addr ip: 0xb01a8c0
inet_network ip: 0xc0a8010b
inet_network ip: 0xb01a8c0
inet_aton ip: 0xb01a8c0
注:inet_addr:返回网络字节序,将点分十进制字符串IP地址转换为二进制IP地址
inet_network:返回主机字节序,将点分十进制字符串IP地址转换为二进制IP地址
inet_aton:返回网络字节序,将点分十进制字符串IP地址转换为二进制IP地址
inet_ntoa:返回点分十进制字符串
例子:
#include<stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
void main()
{
char *source="192.168.1.11";
struct in_addr addr_ip;
if( 0 == inet_aton(source,&addr_ip)) //返回网络字节序
{
printf("inet_aton error \n");
}
printf("netip=0x%x,hostip=0x%x\n", addr_ip.s_addr,ntohl(addr_ip.s_addr));
printf("inet_aton=%s\n",inet_ntoa(addr_ip)); //返回点分十进制字符串
}
输出:
netip=0xb01a8c0,hostip=0xc0a8010b
inet_aton=192.168.1.11