IP地址转换函数 inet_pton、inet_ntop与 inet_aton、inet_addr、 inet_ntoa
inet_pton
NAME
 ????inet_pton - 將 IPv4 和 IPv6 地址從點(diǎn)分十進(jìn)制轉(zhuǎn)換為二進(jìn)制
SYNOPSIS
#include <arpa/inet.h>int inet_pton(int af, const char *src, void *dst);DESCRIPTION
 ????該函數(shù)將字符串src轉(zhuǎn)換為af地址類型協(xié)議簇的網(wǎng)絡(luò)地址,并存儲(chǔ)到dst中。對(duì)于af參數(shù),必須為AF_INET或AF_INET6
RETURN VALUE
 ????inet_pton轉(zhuǎn)換成功則返回1,對(duì)于指定的地址類型協(xié)議簇,如果不是一個(gè)有效的網(wǎng)絡(luò)地址,將轉(zhuǎn)換失敗,返回 0,如果指定的地址類型協(xié)議簇不合法,將返回-1并,并且errno設(shè)置為EAFNOSUPPORT
NOTES
 ????不同于inet_aton和inet——addr,inept_pton支持 IPv6 地址。另一方面,inet_pton僅支持點(diǎn)分十進(jìn)制表示的 IPv4 地址,而inet_aton和inet_addr接受更通用的數(shù)字和點(diǎn)表示法(十六進(jìn)制和八進(jìn)制數(shù)字格式,以及格式不需要顯式寫入所有四個(gè)字節(jié))。
inet_ntop
NAME
 ????inet_ntop - 將 IPv4 和 IPv6 地址從二進(jìn)制轉(zhuǎn)換為點(diǎn)分十進(jìn)制
SYNOPSIS
#include <arpa/inet.h>const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);DESCRIPTION
 ????該函數(shù)將地址類型協(xié)議簇為af的網(wǎng)絡(luò)地址src轉(zhuǎn)換為字符串,并將其存儲(chǔ)到dst中,其中dst不能是空指針。調(diào)用者在參數(shù)size中指定可使用的緩沖字節(jié)數(shù)。
 ????inet_ntop拓展自inet_ntoa來(lái)支持多種地址類型協(xié)議簇,inet_ntoa現(xiàn)在已經(jīng)被棄用。
RETURN VALUE
 ????inet_ntop執(zhí)行成功,返回一個(gè)指向dst的非空指針,如果執(zhí)行失敗,將返回NULL,并且errno設(shè)置為相應(yīng)的錯(cuò)誤類型。
ERRORS
- EAFNOSUPPORT
 af并不是一個(gè)合法的地址類型協(xié)議簇
- ENOSPC
 要轉(zhuǎn)換的字符串地址src其字節(jié)大小超過(guò)了給定的緩沖字節(jié)大小
EXAMPLE
????以下是關(guān)于inet_pton和inet_ntop函數(shù)使用的例子
#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");elseperror("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 - 網(wǎng)絡(luò)地址操作例程
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函數(shù)將網(wǎng)絡(luò)主機(jī)地址cp從 IPv4 的點(diǎn)分十格式轉(zhuǎn)換為二進(jìn)制值(以網(wǎng)絡(luò)字節(jié)序)并且把它保存在inp指針指向的結(jié)構(gòu)體中。如果地址是合法的,那么inet_aton函數(shù)返回非0值,反之返回0值。cp中提供的地址可以要有以下幾種格式:
- a.b.c.d 四個(gè)數(shù)字部分中的每一個(gè)指定地址的一個(gè)字節(jié),字節(jié)按從左到右的順序分配以產(chǎn)生二進(jìn)制地址。
- a.b.c a和b指定二進(jìn)制地址的前兩個(gè)字節(jié),c被解釋為16位值,它定義二進(jìn)制地址的最右邊兩個(gè)字節(jié)。此表示法適用于指定(過(guò)時(shí)的)B類網(wǎng)絡(luò)地址。
- a.b a指定二進(jìn)制地址的第一個(gè)字節(jié),b被解釋為24位值,它定義了二進(jìn)制地址的最右邊三個(gè)字節(jié)。此表示法適用于指定(過(guò)時(shí)的)A類網(wǎng)絡(luò)地址。
- a a被解釋為32位值,直接存儲(chǔ)到二進(jìn)制地址中而不進(jìn)行任何字節(jié)重新排列。
 ????在所有上述形式中,虛線標(biāo)示的地址格式可以用十進(jìn)制,八進(jìn)制(帶前導(dǎo)0)或十六進(jìn)制指定(前導(dǎo)0X)。任何這些形式的地址統(tǒng)稱為IPV4數(shù)字和點(diǎn)符號(hào)。使用正好四個(gè)十進(jìn)制數(shù)稱為 IPv4 點(diǎn)分十進(jìn)制表示法。
 ????如果提供的字符串地址被成功轉(zhuǎn)換,inet_aton函數(shù)返回1,如果提供的字符串地址不合法,返回0(此時(shí)errno不會(huì)被設(shè)置為錯(cuò)誤)
????inet_addr函數(shù)將網(wǎng)絡(luò)主機(jī)地址cp從 IPv4 的數(shù)字點(diǎn)表示形式轉(zhuǎn)換為以網(wǎng)絡(luò)字節(jié)順序的二進(jìn)制形式。如果輸入不合法,INADDR_NONE(通常為-1)被返回。這個(gè)函數(shù)存在一個(gè)問(wèn)題,因?yàn)?1是一個(gè)合法的地址(255.255.255.255)。可以使用inet_aton函數(shù)、inet_pton函數(shù)或者getaddrinfo函數(shù)來(lái)代替使用它,這些函數(shù)提供了一種更清晰的方式來(lái)指示錯(cuò)誤返回。
????inet_ntoa函數(shù)將網(wǎng)絡(luò)主機(jī)地址in轉(zhuǎn)換為點(diǎn)分十格式的 IPv4 地址。該函數(shù)的返回值所指向的字符串駐留在靜態(tài)內(nèi)存中,后續(xù)調(diào)用將覆蓋該緩沖區(qū)。
NOTES
 ????在 x86 架構(gòu)中,主機(jī)字節(jié)順序首先是最低有效字節(jié)(小端),而在因特網(wǎng)上使用的網(wǎng)絡(luò)字節(jié)順序是最高有效字節(jié)(大端)。
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");elseperror("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); }轉(zhuǎn)自:https://www.cnblogs.com/ZhaoxiCheung/p/9388009.html
作者:zxzhang
總結(jié)
以上是生活随笔為你收集整理的IP地址转换函数 inet_pton、inet_ntop与 inet_aton、inet_addr、 inet_ntoa的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: mysql复购率_Mysql与Pyhto
- 下一篇: 【无标题】作业
