[샘] IPv6 주소를 문자열로!?

purewell의 이미지

inet_ntoa라는 함수가 있습니다.

man inet 해서 보면 CONFORMING TO BSD 4.3이라고
나오는데 Windows의 WinSock에서도 그럭 저럭 쓸만한
함수더군요.

ㅡ_-); IPv4는 저 함수로 때웠습니다.

IPv6는 뭘로 때우죠?

inet_ntop함수가 있습니다.

ㅡ_-); man inet_ntop 해서 보면 CONFORMING TO 항목 자체가
없습니다.

WinSock.h엔 그런 함수 없답니다. (물론 WinSock2.h, WinSockX.h인가?
찌끄래기까지 다 뒤져보고 grep 로도 검색해봤지만...)

ㅡ,.-) 어드렇게 해야할까요.

낙엽의 이미지

IPv6 관련 함수들은 대부분 inet6_ntop 이런식으로 사용했던것으로 기억합니다만..

낙엽의 이미지

글 제목도 확인안하고 그냥 생각나는대로 댓글을 달았네요.

IPv6 의 사용예...

    struct sockaddr_in6 *sin6;
    struct sockaddr_in *sin4;
    u_int32_t addr;
    int port;

    if (ai->ai_family != AF_INET6)
	return;
    sin6 = (struct sockaddr_in6 *)ai->ai_addr;
    if (!IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr))
	return;
    sin4 = (struct sockaddr_in *)ai->ai_addr;
    addr = *(u_int32_t *)&sin6->sin6_addr.s6_addr[12];
    port = sin6->sin6_port;
    memset(sin4, 0, sizeof(struct sockaddr_in));
    sin4->sin_addr.s_addr = addr;
    sin4->sin_port = port;
    sin4->sin_family = AF_INET;
    sin4->sin_len = sizeof(struct sockaddr_in);
    ai->ai_family = AF_INET;
    ai->ai_addrlen = sizeof(struct sockaddr_in);