深入浅出IP地址

问题

网络编程接口中一些参数的意义是什么?

socket 参数详解

 

socket() 中的 domain 参数 (协议族) 

socket() 中的 type 和 protocal 参数

type:用于指定协议类型

  • SOCK_STREAM:流式数据 (TCP)
  • SOCK_DGRAM:报文式数据 (UDP)

protocal:用于指定协议族中符合类型的具体协议

  • domain 和 type 几乎可以唯一确定一种协议,因此,这个参数通常为0
  • 即:0代表 domain 和 type 指定后的默认协议

关于 端口号 和 IP地址

端口号是一个2字节数据

0 - 1023 作为特定端口被预定义 (分配给特定应用程序)

IP 地址是一个4字节地址族 (可分为5类地址)

深入解析 IP 地址

IP 地址分为 网络标识 和 主机标识 两部分

网络标识:标识网络主机 (设备) 所在的网络

主机地址:标识网络主机 (设备) 的具体地址

通过子网掩码来区分网络标识和主机标识。

IP 地址 和 子网掩码 配合使用区分 网络标识 和 主机标识

子网掩码的表示形式也是一个4字节的整型数

子网掩码用于从 IP 地址中提取 网络标识

深入解析子网掩码

子网地址:192.168.3.0

广播地址:192.168.3.255

可用地址:256 - 2 = 254

简洁表示法:192.168.3.44 / 24

特殊的地址

  • 0.0.0.0 / 0 - 保留,常用于代表 "缺省网络"
  • 127.0.0.0 / 8 - 回环地址,常用于本地软件回送测试
  • 255.255.255.255 / 32 - 广播地址

私有地址:不在公网使用,只在内网使用

  • A.  10.0.0.0 - 10.255.255.255 / 8
  • B.  172.16.0.0 - 172.31.255.255 / 16
  • C.  192.168.0.0 - 192.168.255.255 / 24

网络编程中的地址类型

地址数据类型解析

IP 地址相关函数

代码示例

地址函数实验

#include <stdio.h>
#include <malloc.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>


int main()
{
	unsigned int addr = inet_addr("1.2.3.4");
	struct in_addr addr1 = {0x09080706};
	struct in_addr addr2 = {0x05040302};

	char* s1 = strcpy(malloc(30), inet_ntoa(addr1));
	char* s2 = strcpy(malloc(30), inet_ntoa(addr2));

	printf("addr = %x\n", addr);
	printf("addr1 = %s\n", s1);
	printf("addr2 = %s\n", s2);

	if(inet_aton("D.T.Software", &addr1))
	{
		printf("addr1 = %x\n", addr1.s_addr);
	}

	free(s1);
	free(s2);

	return 0;
}

inet_addr 函数无法得知 IP 地址字符串是否合法,而 inet_aton 函数可以判断目标 IP 地址字符串是否合法。

inet_ntoa 函数的返回值是存储在静态存储区的,第二次调用此函数时,由于返回值使用的是同一片空间,所以第一次通过此函数返回的字符串就和第二次返回的字符串相同,解决此问题的方案:将返回的字符串拷贝到堆空间。

程序运行结果如下所示:

由于本机的存储方式为小端存储,而这些地址函数的结果会转换为大端存储,所以显示的结果会和我们所定义的相反。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值