inet_ptonについて
inet_ptonについて
inet_pton
は、IPv4/IPv6アドレスの文字列をバイナリ形式へと変更する関数です。
解説するよりコードを書いたほうが早い!
例:文字列をバイナリへと変換する
#include <arpa/inet.h> #include <stdio.h> int main(int argc, char *argv[]) { unsigned char bin_ipv4[sizeof(struct in_addr)]; inet_pton(AF_INET, "127.0.0.1", &bin_ipv4); printf("127.0.0.1\n"); for (int i = 0; i < 4; i++) { printf("\t%dバイト目:%d\n", i, bin_ipv4[i]); } unsigned char bin_ipv6[sizeof(struct in6_addr)]; inet_pton(AF_INET6, "1:2:3:4:5:6:7:8", &bin_ipv6); printf("1:2:3:4:5:6:7:8\n"); for (int i = 0; i < 16; i++) { printf("\t%dバイト目:%d\n", i, bin_ipv6[i]); } return 0; }
実行結果は
127.0.0.1 0バイト目:127 1バイト目:0 2バイト目:0 3バイト目:1 1:2:3:4:5:6:7:8 0バイト目:0 1バイト目:1 2バイト目:0 3バイト目:2 4バイト目:0 5バイト目:3 6バイト目:0 7バイト目:4 8バイト目:0 9バイト目:5 10バイト目:0 11バイト目:6 12バイト目:0 13バイト目:7 14バイト目:0 15バイト目:8
例:IPv6アドレスの文字列が正しいかを確認する。
#include <arpa/inet.h> #include <stdio.h> void check_ipv6_address(const char* addr) { unsigned char bin_ipv6[sizeof(struct in6_addr)]; printf("%sは", addr); if (0 < inet_pton(AF_INET6, addr, &bin_ipv6) ) { printf("IPv6アドレスです。\n"); } else { printf("IPv6アドレスではありません。\n"); } } int main(int argc, char *argv[]) { check_ipv6_address("1:2:3:4:A:B:C:D"); check_ipv6_address("0001:0002:0003:0004:000A:000B:000C:000D"); check_ipv6_address("::"); check_ipv6_address("127.0.0.1"); check_ipv6_address("1::2::3"); return 0; }
実行結果は
1:2:3:4:A:B:C:DはIPv6アドレスです。 0001:0002:0003:0004:000A:000B:000C:000DはIPv6アドレスです。 ::はIPv6アドレスです。 127.0.0.1はIPv6アドレスではありません。 1::2::3はIPv6アドレスではありません。
例:IPv6アドレスが等しいかを確認する。
#include <arpa/inet.h> #include <stdio.h> #include <string.h> void is_same_ipv6_address(const char* addr1, const char* addr2) { unsigned char bin_addr1[sizeof(struct in6_addr)]; unsigned char bin_addr2[sizeof(struct in6_addr)]; inet_pton(AF_INET6, addr1, &bin_addr1); inet_pton(AF_INET6, addr2, &bin_addr2); printf("%sと%sは", addr1, addr2); if (0 == memcmp(bin_addr1, bin_addr2, 16) ) { printf("同じアドレスです。\n"); } else { printf("同じアドレスではありません。\n"); } } int main(int argc, char *argv[]) { is_same_ipv6_address("2001:db8:0:0:1:0:0:1", "2001:DB8:0:0:1::1"); is_same_ipv6_address("2001:db8:0:0:1:0:0:1", "2001:0db8::1:0:0:1"); is_same_ipv6_address("::", "0:0:0:0:0:0:0:0"); is_same_ipv6_address("1:2:3:4:5:6:7:8", "9:a:b:c:d:e:f:1"); return 0; }
実行結果は
2001:db8:0:0:1:0:0:1と2001:DB8:0:0:1::1は同じアドレスです。 2001:db8:0:0:1:0:0:1と2001:0db8::1:0:0:1は同じアドレスです。 ::と0:0:0:0:0:0:0:0は同じアドレスです。 1:2:3:4:5:6:7:8と9:a:b:c:d:e:f:1は同じアドレスではありません。