소켓 통신에서 inet_pton과 inet_addr의 차이점이 뭔가요?

kwkimg3100의 이미지

inet_addr의 경우에는 &구조체변수.sin_addr.s_addr에 할당하는반면에 inet_pton은 &구조체변수.sin_addr에 할당하던대

이 두함수의 차이점을 알고싶어요

yhsuk의 이미지

inet_addr은 IPv4 전용이고, 리턴 타입이 in_addr_t인데 uint32_t 와 동일합니다.
inet_pton은 IPv4, IPv6 모두에 대해서 사용이 가능합니다.
inet_pton의 dst 파리미터는 IPv4일 때는 sin_addr.sin_addr의 포인터이고, IPv6일 때는 sin_addr.sin6_addr의 포인터입니다. 둘 모두를 쓰기 위해 그렇게 되었다고 봐야겠죠.

IPv4용은 다음과 같고

struct sockaddr_in {
    short int          sin_family;  // Address family, AF_INET
    unsigned short int sin_port;    // Port number
    struct in_addr     sin_addr;    // Internet address
    unsigned char      sin_zero[8]; // Same size as struct sockaddr
};
 
// Internet address (a structure for historical reasons)
struct in_addr {
    uint32_t s_addr; // that's a 32-bit int (4 bytes)
};

IPv6용은 다음과 같고

struct sockaddr_in6 {
    u_int16_t       sin6_family;   // address family, AF_INET6
    u_int16_t       sin6_port;     // port number, Network Byte Order
    u_int32_t       sin6_flowinfo; // IPv6 flow information
    struct in6_addr sin6_addr;     // IPv6 address
    u_int32_t       sin6_scope_id; // Scope ID
};
 
struct in6_addr {
    unsigned char   s6_addr[16];   // IPv6 address
};

https://www.joinc.co.kr/w/Site/TCP_IP/IPv6/IPv6Prog

그리고, inet_addr은 255.255.255.255 주소에 대한 리턴값이 INADDR_NONE(-1)과 동일하여 에러인지 255.255.255.255를 변환한 값인지 구분할 수 없는 문제가 있습니다.

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"