您的位置:

详解Address的多个方面

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;
}