Address,翻译为“地址”,是计算机网络中用于标识通信体的一个重要概念。
一、Address的概念
Address,可以理解为一种联系方式,用于唯一识别通信实体。在计算机网络中,短语“Address”通常用于表示网络层和传输层协议,包括IPv4和IPv6协议中的IP地址和MAC地址。Address可以直接让计算机识别和定位设备,是计算机网络通信的基础。
二、Address的分类
Address按照其在计算机网络中的作用和表现形式,可以分为两大类,即:
1、网络层地址:用于在全球范围内唯一标识一个网络节点,在Internet中常指IPv4和IPv6的地址。
2、数据链路层地址:用于在同一物理网络的节点之间唯一标识一个设备,也称MAC地址。
因为两者的标识范围不同,所以也具有不同的编写方式。
三、Address的IPv4编写
IPv4(Internet Protocol version 4,即Internet协议第四版)是目前仍在广泛使用的网络层协议,其地址表示为32位二进制数,通常以点分十进制的方式表现。
例如:192.168.10.10
其中,192.168.10.是网络部分(Netowrk ID),10是主机部分(Host ID)。
//IPv4 Address示例代码 - C++ #include#include int main() { struct in_addr s; //IPv4地址结构体 inet_pton(AF_INET, "192.168.10.10", &s); //将点分十进制地址转换为二进制形式 printf("Network ID: %u\n", ntohl(s.s_addr)); //输出网络部分 printf("Host ID: %u\n", ntohl(s.s_addr) & 0x000000ff); //输出主机部分 return 0; }
四、Address的IPv6编写
IPv6(Internet Protocol version 6,即Internet协议第六版)是未来趋势,地址有128位,采用冒号十六进制的方式表示,因为IPv6地址的位数太多,所以它的组成方式与整个网络的组成吻合是必须的。IPv6地址由三部分组成,即路由前缀、子网标识和接口标识。
例如:2001:da8:1057:900:b45f:3c3d:f50b:8347
其中,2001:da8:1057:900为路由前缀,b45f:3c3d:f50b:8347为接口标识。
//IPv6 Address示例代码 - C++ #include#include int main() { struct in6_addr s; //IPv6地址结构体 inet_pton(AF_INET6, "2001:da8:1057:900:b45f:3c3d:f50b:8347", &s); //将冒号十六进制地址转换为二进制形式 int i; printf("IPv6 Address: "); for (i = 0; i < 16; i++) { printf("%02x", s.s6_addr[i]); //逐位输出16进制数 if (i % 2 == 1 && i < 15) { printf(":"); //每2位输出一个冒号,不包括最后一位 } } return 0; }
五、Address的MAC地址编写
MAC(Media Access Control)地址,也称物理地址,由硬件制造商设定,每个网络接口都有一个独特的MAC地址,用于在同一个局域网中寻找设备。
例如:76:AB:CD:FE:34:A9
//MAC Address示例代码 - C++ #include#include #include #include int main() { struct ifaddrs *ifap, *ifa; struct sockaddr_dl *sdl; u_char *ptr; char mac[64]; //存放MAC地址的字符串 if (getifaddrs(&ifap) == -1) { return 1; //获取网卡列表失败 } for (ifa = ifap; ifa; ifa = ifa->ifa_next) { if ((ifa->ifa_flags & IFF_UP) == 0 || (ifa->ifa_flags & IFF_LOOPBACK) != 0) { continue; //只处理已启用且非环回网卡 } if ((sdl = (struct sockaddr_dl *)ifa->ifa_addr) != NULL && sdl->sdl_family == AF_LINK && sdl->sdl_type == IFT_ETHER) { ptr = (u_char *)LLADDR(sdl); //获取MAC地址二进制形式 snprintf(mac, sizeof(mac), "%02x:%02x:%02x:%02x:%02x:%02x", *ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3), *(ptr + 4), *(ptr + 5)); //转换为十六进制字符串形式 printf("MAC Address: %s\n", mac); //输出MAC地址 break; //已找到符合条件的网卡,退出循环 } } freeifaddrs(ifap); //释放网卡列表 return 0; }