函數原型
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
// af: AF_INET (IPv4) 或 AF_INET6 (IPv6)
// src: 點分十進制/冒號十六進制字符串 (如 "192.168.1.1")
// dst: 輸出網絡位元組序二進制地址 (in_addr 或 in6_addr)
核心回答
inet_pton 轉換的是「要連接的遠端地址」(伺服器地址),而非本機地址。
典型使用場景
// Client 端:連接伺服器
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
inet_pton(AF_INET, "192.168.1.100", &server_addr.sin_addr); // 伺服器 IP
connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
對比:inet_pton vs inet_ntop vs 綁定本機
| 函數 | 方向 | 用途 |
inet_pton | 字符串 → 二進制 | 設定連線目標 / 綁定特定本機 IP |
inet_ntop | 二進制 → 字符串 | 顯示/記錄 IP 地址 |
bind() | - | 綁定本機 IP (通常用 INADDR_ANY 即 0.0.0.0 監聽所有介面) |
常見誤區
- 以為
inet_pton 會自動獲取本機 IP → **不會**,它只是字符串轉二進制工具
- Client 端綁定本機 IP → 通常**不需要**,OS 自動選擇出介面 IP
- Server 端綁定特定 IP → 僅多網卡、多 IP 時需指定,否則用
INADDR_ANY
獲取本機 IP 的正確方法
// 遍歷網卡介面
struct ifaddrs *ifaddr, *ifa;
getifaddrs(&ifaddr);
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_INET) {
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &((struct sockaddr_in*)ifa->ifa_addr)->sin_addr, ip, sizeof(ip));
printf("介面: %s, IP: %s\n", ifa->ifa_name, ip);
}
}
freeifaddrs(ifaddr);
總結
inet_pton 純粹是**文字 IP 轉網絡位元組序二進制**的工具函數。Client 用它設定「要連誰」(伺服器 IP);Server 罕見用它(通常綁 0.0.0.0)。**不負責獲取本機 IP**,也不決定連線方向。
- 上一篇文章: Android 文本文件驗證:判斷三字符串是否同組存在的三種高效方案
- 下一篇文章: Android 離線激活授權:機器碼綁定充值卡算法設計與防破解策略
Copyright ©
程式碼之家 All Rights Reserved