c-socket-programming:inet_ntop
تابع ()inet_ntop
از این تابع برای تبدیل Network-Byte-Order به شکل نمایشی (presntation) استفاده میشه.
#include <arpa/inet.h> const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
نمونه استفاده از ()inet_ntop در IPv4 :
// inet_ntop-ipv4.c // gcc -std=c99 -Wall -Wextra -Werror -pedantic -o inet_ntop-ipv4 inet_ntop-ipv4.c #include <stdio.h> #include <arpa/inet.h> int main() { struct in_addr ia; ia.s_addr = 0xEF9AA8C0; // Network-Byte-Order of 192.168.154.239 char ipv4[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &ia, ipv4, INET_ADDRSTRLEN); printf("ipv4 : %s\n", ipv4); return 0; }
خروجی
ipv4 : 192.168.154.239
در مثال بالا برای سادگی ia.s_addr دستی مقدار دهی شده ولی در عمل این مقدار دهی توسط توابع دیگر انجام میشود و ما کافی ست با تابع ()inet_ntop آن را به شکل قابل نمایش در آوریم.
در نمونه IPv6 ، ورودی inet_ntop را از inet_pton میگیریم :
// inet_ntop-ipv6.c // gcc -std=c99 -Wall -Wextra -Werror -pedantic -o inet_ntop-ipv6 inet_ntop-ipv6.c #include <stdio.h> #include <arpa/inet.h> int main() { char src[INET6_ADDRSTRLEN] = "0000:0000:0000:0000:0000:FFFF:192.168.154.239"; char ipv6[INET6_ADDRSTRLEN]; struct in6_addr i6a; inet_pton(AF_INET6, src, &i6a); inet_ntop(AF_INET6, &i6a, ipv6, sizeof(ipv6)); printf("ipv6 = %s\n", ipv6); return 0; }
خروجی
ipv6 = ::ffff:192.168.154.239
نکته: در مثال های فوق چون in_addr و in6_addr فقط یک عضو دارند، توانستیم فقط نام متغیر از نوع آنها را بنویسیم وگرنه باید بجای ia& باید مینوشتیم (ia.s_addr)& و بجای i6a& باید مینوشتیم (i6a.s6_addr)& که در شرایط فعلی این struct ها، هر دو شکل قابل استفاده است.
c-socket-programming/inet_ntop.txt · آخرین ویرایش: 2024/06/18 22:55 توسط pejman
