IP地址是一种Internet上的主机编址方式,也称为网际协议地址。 IP地址是任意一台主机在网络中的唯一标识
1、ipv4,占32位
2、ipv6,占128位
ipv4一般使用点分十进制字符串来标识,比如192.168.3.103
使用32bit,由{网络ID,主机ID}两部分组成
子网ID:IP地址中由子网掩码中1覆盖的连续位
主机ID:IP地址中由子网掩码中0覆盖的连续位
子网ID不同的网络不能直接通信,如果要通信则需要路由器转发
主机ID全为0的IP地址表示网段地址
主机ID全为1的IP地址表示该网段的广播地址
例如:
192.168.3.10和192.168.3.111可以直接通信
如果192.168.3.x网段而言,192.168.3.0表示网段,192.168.3.255表示广播地址
比如,我跟你打电话,我是不是需要拨打你的号码,你的电话才会响应。号码就相当于我们的ip地址,我知道你的号码(ip),就可以跟你通信。同理,我们学习网络编程,我们要互相通信,是不是也需要一个ip,把ip作为媒介,从而找到你。
答:此ip属于我们人为识别的字符串,计算机是不能直接识别出来,因此,我们就需要把这个人为识别的字符串,转化成计算机能识别的整型数据。
5、地址转化函数(inet_pton())
字符串ip地址转整型数据
头文件#include
函数int inet_pton(int family,const char *strptr, void *addrptr);
功能:
将点分十进制数串转换成32位无符号整数
参数:
family 协议族
AF_INET IPV4网络协议
AF_INET6 IPV6网络协议
strptr 点分十进制数串
addrptr 32位无符号整数的地址
返回值:
成功返回1
失败返回其它
#include
#include
int main()
{
char src[] ="192.168.3.50";
unsigned int dst=0;
unsigned char *q=NULL;
inet_pton(AF_INET,src,&dst);
printf("dst = %d\n",dst);
q=(char *)&dst;
printf("%d,%d,%d,%d\n",*q,*(q+1),*(q+2),*(q+3));
return 0;
}
运行结果
dst = 839100608
192,168,3,50
头文件
#include
函数const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
功能:
将32位无符号整数转换成点分十进制数串
参数:
family 协议族
addrptr 32位无符号整数
strptr 点分十进制数串
len strptr缓存区长度len的宏定义
#define INET_ADDRSTRLEN 16 //即 ipv4
#define INET6_ADDRSTRLEN 46 //即 ipv6返回值:
成功:则返回字符串的首地址
失败:返回NULL
#include
#include
int main()
{
unsigned char src[]={192,168,3,50};
char q[20];
inet_ntop(AF_INET,&src,q,16);
printf("q=%s\n",q);
return 0;
}
运行结果
q=192.168.3.50
这两个函数只能用于在ipv4地址的转换(常用)
7.1、inet_addr()
头文件:
#include
#include
#include
函数:
in_addr_t inet_addr(const char *cp);
功能:将点分十进制ip地址转化为整形数据
参数:
cp:点分十进制的IP地址
返回值:
成功:整形数据
#include
#include
#include
#include
int main()
{
unsigned long int addr;
addr=inet_addr("192,168.3.50");
printf("addr = %ld\n",addr);
return 0;
}
运行结果
addr = 4294967295
7.2、inet_ntoa()
函数:
char * inet_ntoa(struct in_addr in);
功能:将整形数据转化为点分十进制的ip地址
参数:
in:保存ip地址的结构体
返回值:成功:点分十进制的IP地址