더북(TheBook)

S_un 유니온 중 S_un_b 구조체의 값 s_b1, s_b2, s_b3, s_b4 필드에 값을 넣으면 사람이 읽기 쉬운 형태로 주소를 지정할 수 있다.

sin_zero는 사용하지 않으며 sockaddr_in 구조체의 크기를 sockaddr과 맞추기 위한 패딩값이다. 일관성 유지를 위해 값을 0으로 모두 채워야 한다.

Tip

보통 BSD 소켓 구조체 중 하나를 초기화할 땐 항상 그 멤버를 0으로 memset()해 두는 것이 좋다.2 이렇게 하면 어떤 플랫폼에선 사용하지 않는 값이 다른 플랫폼에서 사용되면서 발생할 수 있는 이상한 문제를 미연에 방지할 수 있다.

IP 주소를 4바이트 정수로 지정하거나 포트 번호를 지정할 때, 이렇게 여러 바이트를 묶어서 쓰려면 TCP/IP 스택과 호스트 컴퓨터의 바이트 순서 체계가 서로 다를 수도 있다는 점에 유의해야 한다. 4장 객체 직렬화에서 플랫폼마다 바이트 순서가 어떤 식으로 다를 수 있는지 자세히 알아보겠지만, 일단은 소켓 주소 구조체에서 여러 바이트로 된 숫자를 호스트의 순서가 아닌 네트워크의 순서 체계로 변환해야 한다는 것 정도만 알아두자. 이렇게 변환하려면 소켓 API에서 제공하는 htons()htonl() 함수를 사용한다.

uint16_t htons(uint16_t hostshort);
uint32_t htonl(uint32_t hostlong);

 


 

2  역주 POD이므로 C+ +11식 초기화도 좋다. sockaddr_in sin { };

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.