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

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/289212.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-24 03:01
下一篇 2024-12-24 03:02

相關推薦

發表回復

登錄後才能評論