zoukankan      html  css  js  c++  java
  • IP地址转换函数——inet_pton inet_ntop inet_aton inet_addr inet_ntoa

    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
    ", 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
    ", 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
    ", 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
    ", str);
    
       exit(EXIT_SUCCESS);
    }
    
  • 相关阅读:
    Delphi XE4 FireMonkey 开发 IOS APP 发布到 AppStore 最后一步.
    Native iOS Control Delphi XE4
    Delphi XE4 iAD Framework 支持.
    using IOS API with Delphi XE4
    GoF23种设计模式之行为型模式之命令模式
    Android青翼蝠王之ContentProvider
    Android白眉鹰王之BroadcastReceiver
    Android倚天剑之Notification之亮剑IOS
    Android紫衫龙王之Activity
    GoF23种设计模式之行为型模式之访问者模式
  • 原文地址:https://www.cnblogs.com/ZhaoxiCheung/p/9388009.html
Copyright © 2011-2022 走看看