3.3 소켓 주소
모든 네트워크 계층 패킷에는 발신지 주소와 목적지 주소가 필요하다. 전송 계층 패킷은 여기에 더해 발신지 포트와 목적지 포트가 필요하다. 이 주소 정보를 소켓 라이브러리와 주고받기 위해 API에 sockaddr 자료형이 정의되어 있다.
struct sockaddr { uint16_t sa_family; char sa_data[14]; };
sa_family는 주소의 종류를 나타내는 상숫값이다. 소켓 주소를 소켓에 사용하려면 sa_family 값이 소켓을 만들 때 썼던 af 파라미터와 일치해야 한다. sa_data 필드에는 주소 패밀리에 따라 다양한 포맷의 주소를 담을 수 있어야 하므로 바이트의 배열로 되어 있다. 기술적으론 바이트 값을 직접 수작업으로 채워 넣을 수 있겠지만, 다양한 주소 패밀리의 메모리 레이아웃을 알아야 한다는 단점이 있다. 이를 보완하고자 API엔 널리 쓰는 주소 패밀리에 딱 맞게 정의된 전용 자료형이 있다. 소켓 API는 클래스나 다형성, 상속 같은 객체 지향 개념이 도입되기 전에 개발되었으므로, 주소를 요구하는 소켓 API 함수에 이들 자료형을 넘기려면 sockaddr형으로 직접 캐스팅해 주어야 한다. IPv4 패킷용 주소를 만들려면 sockaddr_in형을 사용한다.