首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

inet_pton 函數詳解:IP 地址轉換的目標是伺服器地址而非本機地址

     編輯:程式設計綜合問答

函數原型


#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 → **不會**,它只是字符串轉二進制工具
  • 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**,也不決定連線方向。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函數方向用途
inet_pton字符串 → 二進制設定連線目標 / 綁定特定本機 IP
inet_ntop二進制 → 字符串顯示/記錄 IP 地址
bind()-綁定本機 IP (通常用 INADDR_ANY 即 0.0.0.0 監聽所有介面)