IPv4 或 IPv6 位址表示字串,如:
- 204.152.189.116 (dotted-decimal 的 IPv4 位址)
- ::1 (colon-separated hexadecimal 的 IPv6 位址)
- ::FFFF:204.152.189.116 (IPv4-mapped 的 IPv6 位址)
inet_pton() 可轉換成為二進位格式 (struct in_addr 或 strut in6_addr)。而 inet_ntop() 反之。
函數名稱中的 p 是「presentation」,指文字表示字串;n 是「network」。
#include <arpa/inet.h>
// 轉換 IPv4 或 IPv6 數字位址 (表示字串) src_str 為二進位格式 addrptr
int inet_pton(
int family, // AF_INET 或 AF_INET6
const char *src_str,
void *addrptr);
// 回傳 1:成功、0:src_str 格式不是表示字串、–1 on error
// 轉換二進位格式 addrptr 為表示字串 dst_str
const char *inet_ntop(
int family,
const void *addrptr,
char *dst_str,
size_t len);
// 回傳 指向 dst_str 的文字字串: 成功, NULL: 錯誤
- family 可以是 AF_INET 或 AF_INET6。擴充並捨棄 inet_aton() 與 inet_ntoa() (只能用在 IPv4)。問題:程式如何判斷位址是 IPv4 或 IPv6?
- addrptr 依據 family 可指到 struct in_addr 或 struct in6_addr。
- 呼叫 inet_ntop() 需提供長度 len 的 dst_str buffer,適當的長度是 INET_ADDRSTRLEN (16) 或 INET6_ADDRSTRLEN (46)。
參考來源
TLPI §59.6 §59.13.1
沒有留言:
張貼留言