# 簡介
在開發網路應用程式時,我們可能需要取得發起 HTTP 請求介面的 MAC 地址 。本篇筆記將介紹如何透過 Go 語言的標準函式庫取得 HTTP 請求的 MAC 地址。
# 實現步驟
- 解析 URL, 取得主機地址。
- 建立 TCP 連線到該主機地址,以取得本地 IP 位址。
- 使用本地 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) | |
} |
# 注意事項
- 該方法假設 HTTP 請求是發送到本機,則無法取得 MAC 地址。
- 如果無法建立到目標主機的 TCP 連線,則無法取得本地 IP 位址,進而無法找到對應的 MAC 地址。