ADDR2ASCII(3)

명칭
addr2ascii, ascii2addr - 일반적인 주소 포맷 routine

프로그램 라이브러리
libc

서식
<sys/types.h> <netinet/in.h> <arpa/inet.h> char * addr2ascii(int af, const void *addrp, int len, char *buf) int ascii2addr(int af, const char *ascii, void *result)

해설
routine addr2ascii() (와)과 ascii2addr() (은)는, 바이너리 형식과 주소 패밀리에게 적절한 인자 가능한 형식과의 사이에 네트워크 주소를 변환하는데 사용됩니다. 양쪽 모두의 함수와도, 변환 프로세스로 사용되는 주소 패밀리를 지정한다 af 인수를 사용합니다 (현시점에서는, AF_INET 및 AF_LINK 주소 패밀리만이 서포트되고 있습니다).

addr2ascii() 함수는, 바이너리의 네트워크 형식의 주소를 인자 가능한 형식에 변환하는데 사용됩니다. af 외에, 3 개의 인수를 가집니다. addrp 인수는, 변환하는 네트워크 주소에의 포인터입니다. len 인수는, 주소의 길이입니다. buf 인수는, 결과를 보관 유지하기 위해서 호출해 원이 할당한다 버퍼에의 옵션의 포인터입니다. 누르포인타가 건네받으면(자), addr2ascii() (은)는 정적으로 할당해진 버퍼를 사용합니다.

ascii2addr() 함수는, addr2ascii() (와)과 역의 조작을 실행합니다. af 에 가세해, 2 개의 파라미터 ascii (와)과 result (을)를 사용합니다. ascii 파라미터는, 바이너리에 변환되는 캐릭터 라인에의 포인터입니다. result 파라미터는, 지정된 패밀리에게 적절한 네트워크 주소 구조체에의 포인터입니다.

지정된 패밀리에 있어 사용되는 바이너리 주소로서 적절한 구조체는 다음과 같습니다.

AF_INET
    struct in_addr (in <netinet/in.h>)
AF_LINK
    struct sockaddr_dl (in <net/if_dl.h>)

반환값
addr2ascii() 함수는, 건네받은 버퍼의 주소, 또는 NULL 포인터가 건네받았을 경우는 정적 버퍼의 주소를 돌려줍니다. 처리가 실패했을 경우는, 누르포인타를 돌려줍니다. ascii2addr() 함수는, 바이너리 주소의 길이 (바이트 단위)를 돌려줍니다. 처리가 실패했을 경우는 -1 을 돌려줍니다.

예
inet(3) 함수 inet_ntoa() (와)과 inet_aton() (은)는 다음과 같이 실장할 수가 있습니다.

    #include <sys/types.h>
    #include <sys/socket.h>
    #Include <netinet/in.h>
    #include <arpa/inet.h>
    char *
    inet_ntoa(struct in_addr addr)
    {
            return addr2ascii(AF_INET, &addr, sizeof addr, 0);
    }
    int
    inet_aton(const char *ascii, struct in_addr *addr)
    {
            return (ascii2addr(AF_INET, ascii, addr)
                == sizeof(*addr));
    }

실제로는, 이것은 실행할 수 없습니다. addr2ascii() (와)과 ascii2addr() (은)는, 다른 방법이 아니고, inet(3) 함수로 실장되고 있기 때문입니다.

에러
처리 실패가 돌려주어졌을 때, errno 에 다음의 값의 1 개의 설정됩니다.

[ENAMETOOLONG]
    addr2ascii() routine는, af 에 의해 건네받은 주소 패밀리에게 부적절한 파라미터 len (을)를 건네받았습니다.

[EPROTONOSUPPORT]
    몇개의 routine에, AF_INET 또는 AF_LINK (은)는 아니다 af 파라미터가 건네받았습니다.

[EINVAL]
    ascii2addr() 에게 건네진 캐릭터 라인은, 주소 패밀리 af 에 붙어 부적절하게 포맷 되고 있었습니다.

관련 항목
inet(3), linkaddr(3), inet(4)

역사
이것에 가까운 인터페이스는, 원래 Craig Partridge 에 의해 제안되었습니다. 이 인터페이스 자체는, INRIA 의 IPv6 의 실장에 의해, 처음 등장했습니다.

저자
코드와 문서는 MIT Laboratory for Computer Science 의 Garrett A. Wollman 에 의하는 것입니다.

버그
오리지날의 실장은 IPv6 를 서포트하고 있었습니다. 이 서포트는, 그 중 restore될 것입니다. NRL 의 실장에는, AF_ISO 및 AF_NS 주소 패밀리의 서포트도 포함되어 있었습니다.

이 인터페이스의 일반성에 대해서는, 얼마인가 의문이 있습니다. 정말로 일반적인 인터페이스이면, 버퍼를 동적으로 할당하는 것이 할 수 있도록, 사용되는 버퍼의 길이를 결정하는 수단을 갖추고 있겠지요 해, 바이너리 주소를 보관 유지하는데는 반드시 “struct sockaddr” (을)를 요구하겠지요. 유감스럽지만, 이것은 기존의 방식과 호환성이 없습니다. 이 제한을 위해, 임의의 주소 패밀리로부터 네트워크 주소를 인자하는 routine는, 필요한 최대 버퍼장이나, 바이너리 주소로서 사용하는 주소의 적절한 부분이라고 했다 내부적인 지식을 여전히 가지고 있지 않으면 안됩니다.