تابع ()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 ها، هر دو شکل قابل استفاده است.