| 목차 |

4 IPv4에서 IPv6으로 넘어가기

“아무튼 저는 IPv6에서 동작하게 하려면 제 코드의 어디를 바꿔야 하는지 알고 싶단 말이에요! 당장 알려주세요!”

알겠어요! 알겠어요!

여기 적을 내용의 대부분은 앞에서 이미 다룬 것이지만, 참을성 없는 분들을 위한 요약판이라고 생각하시면 됩니다. (물론 실제로는 이것보다 더 많은 내용이 있겠지만, 이 안내서에서 다루는 범위는 이 정도입니다.)

  1. 우선 struct sockaddr 정보를 얻기 위해 수작업 대신 getaddrinfo() 함수를 사용하세요. 이렇게 하면 여러분은 IP 버전에 신경 쓰지 않아도 되고, 뒤따르는 여러 단계를 없앨 수 있습니다.

  2. IP 버전에 관계된 것을 하드코딩하는 곳을 찾아낼 때마다 헬퍼 함수로 감싸 두세요.

  3. AF_INETAF_INET6로 바꾸세요.

  4. PF_INETPF_INET6로 바꾸세요.

  5. INADDR_ANY 대입을 in6addr_any 대입으로 바꾸세요. 이런 차이가 있습니다:

    struct sockaddr_in sa;
    struct sockaddr_in6 sa6;
    
    sa.sin_addr.s_addr = INADDR_ANY;  // 모든 로컬 IPv4 인터페이스에 바인드합니다
    sa6.sin6_addr = in6addr_any; // 모든 로컬 IPv6 인터페이스에 바인드합니다

    또한 struct in6_addr을 선언할 때 IN6ADDR_ANY_INIT을 초기값으로 사용할 수 있습니다. 아래와 같이 합니다.

    struct in6_addr ia6 = IN6ADDR_ANY_INIT;
  6. struct sockaddr_in 대신 struct sockaddr_in6을 사용하고, 필요한 필드에 “6”을 적절히 덧붙이세요. (위의 structs을 참고하세요) sin6_zero 필드는 없습니다.

  7. struct in_addr 대신 struct in6_addr를 사용하고, 필요한 필드에 “6”을 적절히 덧붙이세요. (위의 structs을 참고하세요)

  8. inet_aton()이나 inet_addr() 대신에 inet_pton()을 사용하세요.

  9. inet_ntoa() 대신에 inet_ntop()을 사용하세요.

  10. gethostbyname() 대신에 더 뛰어난 getaddrinfo()를 사용하세요.

  11. gethostbyaddr() 대신에 더 뛰어난 getnameinfo()를 사용하세요. (gethostbyaddr()가 IPv6에서도 여전히 작동하기는 합니다).

  12. INADDR_BROADCAST는 더 이상 작동하지 않습니다. 대신 IPv6 멀티캐스트를 사용하세요.

자, 끝입니다!


| 목차 |