1. ホーム

inet_pton()およびinet_ntop()関数の説明

2022-02-19 09:42:41
<スパン <スパン 1. ネットワーク伝送のためにipアドレスをバイナリ値に変換する

int inet_aton(const char *cp, struct in_addr *inp);


inet_aton() 変換 ネットワークホストアドレス ip (例: 192.168.1.10) を バイナリ値 と構造体in_addr構造体に格納されている、つまり、第2パラメータ*inp、関数は、非ゼロを返すCPのホストが有効なグランドを持っていることを意味し、戻り値は0は、ホストアドレスが無効であることを意味します。(その この変換後は、ネットワーク転送には使用できず、ホストのバイトオーダーをネットワークのバイトオーダーに変換するためにhtonsまたはhtonl関数の呼び出しが必要です )


in_addr_t inet_addr(const char *cp);

inet_addr関数変換 ネットワークホストアドレス (例: 192.168.1.10) から ネットワークバイトオーダーバイナリ値 引数の char *cp が無効な場合、この関数は -1(INADDR_NONE) を返す。また、アドレスが 255.255.255.255 の場合も -1 を返す。255.255.255.255 は有効なアドレスだが inet_addr はこれを扱えないのだ。


2. ネットワークから送信された2進数値をドット付き10進数のipアドレスに変換する

char *inet_ntoa(struct in_addr in);

inet_ntoa機能 ネットワークバイトソートアドレスを変換する 標準ASCIIドット区切りアドレス この関数はドット区切りの文字列(例えば192.168.1.10)のアドレスへのポインタを返します。そのスペースは静的に割り当てられるので、この関数を2回目に呼ぶと、前の呼び出しが上書きされます(ダブルキャップされる)。

ドット付き10進数のIPを出力するには?次のプログラムを見てみましょう。

#include <stdio.h>   
#include <sys/socket.h>   
#include <netinet/in.h>   
#include <arpa/inet.h>   
#include <string.h>   
int main()   
{   
	struct in_addr addr1,addr2;   
	ulong l1,l2;   
	l1 = inet_addr("192.168.0.74");   
	l2 = inet_addr("211.100.21.179");   
	memcpy(&addr1, &l1, 4);   
	memcpy(&addr2, &l2, 4);   
	printf("%s : %s\n", inet_ntoa(addr1), inet_ntoa(addr2)); //note the result of running this sentence   
	printf("%s\n", inet_ntoa(addr1));   
	printf("%s\n", inet_ntoa(addr2));  
	return 0;   
}   





実際の実行結果は以下の通りです。 

192.168.0.74 : 192.168.0.74 // ここでわかるように、printfのinet_ntoaは一度だけ実行されました。  

192.168.0.74  

211.100.21.179  

inet_ntoa は char * を返し、この char * のスペースは inet_ntoa 内で静的に確保されます。 そのため、それ以降にinet_ntoaを呼び出すと、前の呼び出しが上書きされます。最初のprintf文の結果は、printfの変数引数のみを勘定に入れることができます。 値は右から左へ で終わりです。


<スパン 3. <スパン ネットワークアドレス変換機能 inet_pton と inet_ntop の追加
この2つの関数はIPv6に付属しており、IPv4とIPv6の両方のアドレスに対して機能します。関数内のpとnはそれぞれプレゼンテーションと数値を表します。アドレスの表現形式は通常ASCII文字列であり、数値形式はソケットのアドレス構造体に格納されるバイナリ値である。

#include <arpe/inet.h>
int inet_pton(int family, const char *strptr, void *addrptr); // convert dotted decimal ip address to numeric format for network transfer
        Return value: 1 if successful, 0 if the input is not a valid expression, -1 if there is an error

const char * inet_ntop(int family, const void *addrptr, char *strptr, size_t len); //convert numeric format to dotted-decimal ip address format
        Return value: pointer to structure if successful, NULL if error





(1) 両関数の family パラメータには、AF_INET (ipv4) または AF_INET6 (ipv6) のいずれかを指定できる。familyパラメータに、サポートされていないアドレスファミリが指定された場合、両関数はエラーを返し、 errnoにEAFNOSUPPORTを設定します。

(2) 最初の関数は、strptr ポインタが指す文字列の変換を試み、そのバイナリ結果を addrptr ポインタ経由で格納し、成功すれば 1 を、入力文字列が指定したファミリに対して有効な表現形式でなければ 0 を返します。

(3) inet_ntop 数値形式(addrptr)から式(strptr)への逆変換を行う関数です。呼び出し側は、対象となるメモリセルに対してメモリを割り当て、そのサイズを指定しなければならない。lenパラメータは、関数が呼び出し側のバッファをオーバーフローした場合に備えて、対象となるメモリセルのサイズである。lenが小さすぎて式の結果を保持できない場合は、ヌルポインタが返され、ENOSPCとしてerrnoに設定される。


<スパン <スパン 4. 例

inet_pton(AF_INET, ip, &foo.sin_addr); // Substitute foo.sin_addr.addr=inet_addr(ip);


char str[INET_ADDRSTRLEN];
char *ptr = inet_ntop(AF_INET,&foo.sin_addr, str, sizeof(str)); // substitute ptr = inet_ntoa(foo.sin_addr)