# 簡介

在開發網路應用程式時,我們可能需要取得發起 HTTP 請求介面的 MAC 地址 。本篇筆記將介紹如何透過 Go 語言的標準函式庫取得 HTTP 請求的 MAC 地址。

# 實現步驟

  1. 解析 URL, 取得主機地址。
  2. 建立 TCP 連線到該主機地址,以取得本地 IP 位址。
  3. 使用本地 IP 位址來查找與之相關的網路介面,並取得該介面的 MAC 地址。

以下是具體的 Go 程式碼實現:

func getMacAddr(reqURL string) (string, error) {
    var (
        host         string
        parsedURL    *url.URL
        err          error
        interfaces   []net.Interface
        localAddress net.IP
    )
    // 1. 解析 URL, 取得主機地址
    parsedURL, err = url.Parse(reqURL)
    if !strings.Contains(parsedURL.Host, ":") {
        if parsedURL.Scheme == "https" {
            host = fmt.Sprintf("%s:443", parsedURL.Host)
        } else {
            host = fmt.Sprintf("%s:80", parsedURL.Host)
        }
    } else {
        host = parsedURL.Host
    }
    // 2. 建立 TCP 連線到該主機地址,以取得本地 IP 位址
    conn, err := net.Dial("tcp", host)
    if err != nil {
        return "", err
    }
    defer conn.Close()
    localAddress = conn.LocalAddr().(*net.TCPAddr).IP
    // 3. 使用本地 IP 位址來查找與之相關的網路介面,並取得該介面的 MAC 地址
    if interfaces, err = net.Interfaces(); err != nil {
        return "", err
    }
    for interfaceIndex := range interfaces {
        addresses, _ := interfaces[interfaceIndex].Addrs()
        for _, address := range addresses {
            if address.(*net.IPNet).IP.Equal(localAddress) {
                return interfaces[interfaceIndex].HardwareAddr.String(), nil
            }
        }
    }
    return "", err
}

# 使用方式

您可以在您的 Go 應用程式中呼叫 getMacAddr 函式,並傳入需要取得 MAC 地址的 URL, 即可取得對應的 MAC 地址。

例如:

macAddr, err := getMacAddr("<https://www.example.com>")
if err != nil {
    fmt.Println("Error:", err)
} else {
    fmt.Println("MAC Address:", macAddr)
}

# 注意事項

  1. 該方法假設 HTTP 請求是發送到本機,則無法取得 MAC 地址。
  2. 如果無法建立到目標主機的 TCP 連線,則無法取得本地 IP 位址,進而無法找到對應的 MAC 地址。