IP地址轉換函式——inet_pton inet_ntop inet_aton inet_addr inet_ntoa

Zhaoxi_Zhang發表於2018-12-12

inet_pton

NAME     inet_pton - 將 IPv4 和 IPv6 地址從點分十進位制轉換為二進位制

SYNOPSIS

	#include <arpa/inet.h>
	int inet_pton(int af, const char *src, void *dst);
複製程式碼

DESCRIPTION     該函式將字串src轉換為af地址型別協議簇的網路地址,並儲存到dst中。對於af引數,必須為AF_INETAF_INET6

RETURN VALUE     inet_pton轉換成功則返回1,對於指定的地址型別協議簇,如果不是一個有效的網路地址,將轉換失敗,返回 0,如果指定的地址型別協議簇不合法,將返回-1並,並且errno設定為EAFNOSUPPORT

NOTES     不同於inet_atoninet——addrinept_pton支援 IPv6 地址。另一方面,inet_pton僅支援點分十進位制表示的 IPv4 地址,而inet_atoninet_addr接受更通用的數字和點表示法(十六進位制和八進位制數字格式,以及格式不需要顯式寫入所有四個位元組)。

inet_ntop

NAME     inet_ntop - 將 IPv4 和 IPv6 地址從二進位制轉換為點分十進位制

SYNOPSIS

	#include <arpa/inet.h>
	const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
複製程式碼

DESCRIPTION     該函式將地址型別協議簇為af的網路地址src轉換為字串,並將其儲存到dst中,其中dst不能是空指標。呼叫者在引數size中指定可使用的緩衝位元組數。     inet_ntop擴充自inet_ntoa來支援多種地址型別協議簇,inet_ntoa現在已經被棄用。

RETURN VALUE     inet_ntop執行成功,返回一個指向dst的非空指標,如果執行失敗,將返回NULL,並且errno設定為相應的錯誤型別。

ERRORS

  • EAFNOSUPPORT af並不是一個合法的地址型別協議簇
  • ENOSPC 要轉換的字串地址src其位元組大小超過了給定的緩衝位元組大小

EXAMPLE

    以下是關於inet_ptoninet_ntop函式使用的例子

#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
   unsigned char buf[sizeof(struct in6_addr)];
   int domain, s;
   char str[INET6_ADDRSTRLEN];

   if (argc != 3) {
       fprintf(stderr, "Usage: %s {i4|i6|<num>} string\n", argv[0]);
       exit(EXIT_FAILURE);
   }

   domain = (strcmp(argv[1], "i4") == 0) ? AF_INET :
            (strcmp(argv[1], "i6") == 0) ? AF_INET6 : atoi(argv[1]);

   s = inet_pton(domain, argv[2], buf);
   if (s <= 0) {
       if (s == 0)
           fprintf(stderr, "Not in presentation format");
       else
           perror("inet_pton");
       exit(EXIT_FAILURE);
   }

   if (inet_ntop(domain, buf, str, INET6_ADDRSTRLEN) == NULL) {
       perror("inet_ntop");
       exit(EXIT_FAILURE);
   }

   printf("%s\n", str);

   exit(EXIT_SUCCESS);
}
複製程式碼

inet_aton inet_addr inet_ntoa

NAME     inet_aton, inet_addr, inet_ntoa - 網路地址操作例程

SYNOPSIS

	#include <sys/socket.h>
	#include <netinet/in.h>
	#include <arpa/inet.h>
	
	typedef uint32_t in_addr_t;
	struct in_addr{
		in_addr_t s_addr;
	};

	int inet_aton(const char *cp, struct in_addr *inp);
	in_addr_t inet_addr(const char *cp);
	char *inet_ntoa(struct in_addr in);
複製程式碼

DESCRIPTION     inet_aton函式將網路主機地址cp從 IPv4 的點分十格式轉換為二進位制值(以網路位元組序)並且把它儲存在inp指標指向的結構體中。如果地址是合法的,那麼inet_aton函式返回非0值,反之返回0值。cp中提供的地址可以要有以下幾種格式:

  • a.b.c.d 四個數字部分中的每一個指定地址的一個位元組,位元組按從左到右的順序分配以產生二進位制地址。
  • a.b.c a和b指定二進位制地址的前兩個位元組,c被解釋為16位值,它定義二進位制地址的最右邊兩個位元組。此表示法適用於指定(過時的)B類網路地址。
  • a.b a指定二進位制地址的第一個位元組,b被解釋為24位值,它定義了二進位制地址的最右邊三個位元組。此表示法適用於指定(過時的)A類網路地址。
  • a a被解釋為32位值,直接儲存到二進位制地址中而不進行任何位元組重新排列。     在所有上述形式中,虛線標示的地址格式可以用十進位制,八進位制(帶前導0)或十六進位制指定(前導0X)。任何這些形式的地址統稱為IPV4數字和點符號。使用正好四個十進位制數稱為 IPv4 點分十進位制表示法。     如果提供的字串地址被成功轉換,inet_aton函式返回1,如果提供的字串地址不合法,返回0(此時errno不會被設定為錯誤)

    inet_addr函式將網路主機地址cp從 IPv4 的數字點表示形式轉換為以網路位元組順序的二進位制形式。如果輸入不合法,INADDR_NONE(通常為-1)被返回。這個函式存在一個問題,因為-1是一個合法的地址(255.255.255.255)。可以使用inet_aton函式、inet_pton函式或者getaddrinfo函式來代替使用它,這些函式提供了一種更清晰的方式來指示錯誤返回。

    inet_ntoa函式將網路主機地址in轉換為點分十格式的 IPv4 地址。該函式的返回值所指向的字串駐留在靜態記憶體中,後續呼叫將覆蓋該緩衝區。

NOTES     在 x86 架構中,主機位元組順序首先是最低有效位元組(小端),而在因特網上使用的網路位元組順序是最高有效位元組(大端)。

EXAMPLE

#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[])
{
   unsigned char buf[sizeof(struct in6_addr)];
   int domain, s;
   char str[INET6_ADDRSTRLEN];

   if (argc != 3) {
       fprintf(stderr, "Usage: %s {i4|i6|<num>} string\n", argv[0]);
       exit(EXIT_FAILURE);
   }

   domain = (strcmp(argv[1], "i4") == 0) ? AF_INET :
            (strcmp(argv[1], "i6") == 0) ? AF_INET6 : atoi(argv[1]);

   s = inet_pton(domain, argv[2], buf);
   if (s <= 0) {
       if (s == 0)
           fprintf(stderr, "Not in presentation format");
       else
           perror("inet_pton");
       exit(EXIT_FAILURE);
   }

   if (inet_ntop(domain, buf, str, INET6_ADDRSTRLEN) == NULL) {
       perror("inet_ntop");
       exit(EXIT_FAILURE);
   }

   printf("%s\n", str);

   exit(EXIT_SUCCESS);
}
複製程式碼

相關文章