프로그래밍/C,C++

inet_pton(), inet_ntop()

MAKGA 2021. 10. 9. 00:23
320x100

기존 소켓에서 사용하던 inet_addr(), inet_ntoa() 함수들을 사용하면

error C4996: 'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings
error C4996: 'inet_ntoa': Use inet_ntop() or InetNtop() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings

이런 에러가 발생한다.

물론 4996 error는 옵션변경으로 warning으로 처리되게 하거나 warning 조차도 안보이게 할 순 있지만, IPv4 전용 함수이기 때문에 IPv6 사용을 대비해서 호환성 좋은 함수로 변경해서 쓰도록 하자. 

inet_addr()는 inet_pton() 함수로, inet_ntoa()는 inet_ntop()로 대체해서 사용할 수 있다.

 

inet_pton 함수 원형 (문자 주소를 숫자 주소로 변환)

INT WSAAPI inet_pton(
    INT   Family,
    PCSTR pszAddrString,
    PVOID pAddrBuf
);

Family: 주소의 family로 AF_INET(IPv4)AF_INET6(Ipv6) 중에서 사용할 수 있다.

pszAddrString: family에 맞는 IP주소의 문자열의 주소를 의미한다.

pAddrBuf: IP 주소의 정수를 저장할 버퍼의 주소를 의미한다. AF_INET인 경우엔 IN_ADDR 크기보다, AF_INET6인 경우엔 IN6_ADDR 크기보다 큰 버퍼를 전달해야 한다.

 

return: 오류가 발생하지 않으면 inet_pton 함수는 1을 반환한다. 유효한 주소 문자열이 아닌 경우엔 0을 반환하고 그 외엔 -1을 반환하는데, 이 경우 WSAGetLastError() 함수를 통해 좀 더 자세한 원인을 찾을 수 있다.

에러 코드 의미
WSAEAFNOSUPPORT (10047) 잘못된 family를 지정했음
WSAEFAULT (10014) pszAddrString 또는 pAddrBuf에 잘못된 주소를 전달했음

 

inet_ntop 함수 원형 (숫자 주소를 문자 주소로 변환)

PCSTR WSAAPI inet_ntop(
    INT        Family,
    const VOID *pAddr,
    PSTR       pStringBuf,
    size_t     StringBufSize
);

Family: 주소의 family로 AF_INET(IPv4) AF_INET6(Ipv6) 중에서 사용할 수 있다.

pAddr: 문자열로 변환할 네트워크 바이트의 IP주소의 포인터. IPv4 주소의 경우는 IN_ADDR, IPv6 주소의 경우는 IN6_ADDR struct를 가리켜야 한다.

pStringBuf: IP 주소를 저장할 버퍼의 포인터. IPv4는 16자, IPv6는 46자 이상의 크기를 가진 버퍼를 등록해야 한다.

StringBufSize: pStringBuf의 크기

 

return: 오류가 발생하지 않으면 inet_ntop 함수는 IP주소의 문자열 표현을 저장한 버퍼의 포인터를 반환하고, 오류가 발생하면 NULL값이 반환된다. 이 경우 WSAGetLastError() 함수를 통해 좀 더 자세한 원인을 찾을 수 있다.

에러 코드 의미
WSAEAFNOSUPPORT (10047) 잘못된 family를 지정했음
ERROR_INVALID_PARAMETER pStringBuf에 NULL 포인터 이거나 크기가 적은 버퍼, 또는 StringBufSize가 0인 경우

 

 

#define InetPtonA       inet_pton
#define InetNtopA       inet_ntop

#ifdef UNICODE
#define InetPton        InetPtonW
#define InetNtop        InetNtopW
#else
#define InetPton        InetPtonA
#define InetNtop        InetNtopA
#endif

 

 

 

 

https://docs.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-inet_pton

 

inet_pton function (ws2tcpip.h) - Win32 apps

The InetPton function converts an IPv4 or IPv6 Internet network address in its standard text presentation form into its numeric binary form. The ANSI version of this function is inet_pton.

docs.microsoft.com

https://docs.microsoft.com/en-us/windows/win32/api/ws2tcpip/nf-ws2tcpip-inet_ntop

 

inet_ntop function (ws2tcpip.h) - Win32 apps

The InetNtop function converts an IPv4 or IPv6 Internet network address into a string in Internet standard format. The ANSI version of this function is inet_ntop.

docs.microsoft.com

 

320x100

'프로그래밍 > C,C++' 카테고리의 다른 글

c++ Infographics & Cheat Sheets  (0) 2021.10.18
Multibyte ↔ UNICODE ↔ UTF8 변환하기  (0) 2021.10.15
enum 크기  (0) 2021.10.06
자주 사용하는 함수  (0) 2021.07.30
[C++] 동적 배열을 이용한 stack  (0) 2021.06.30