sockaddr 구조체
: 소켓 주소를 표현하는 구조체
TCP/IP만을 목적으로 만들어진 것이 아니기 때문에, 다양한 주소체계에 맞게 범용 목적으로 사용하기 위해 단순한 구조를 가지고 있다
struct sockaddr
{
sa_family_t sa_family; //소켓의 주소체계
char sa_data[14] // 해당 주소체계에서 사용하는 주소정보
}
sockaddr_in 구조체
:ipv4 주소체계에서 사용하는 구조체
소켓 프로그램은 범용 주소 구조체로 sockaddr을 사용하지만, 주소체계의 종류에 따라 별도의 전용 구조체를 만들어 사용하는게 편리하다
(Local Unix 주소 체계는 sockaddr_in을 사용한다)
- 소켓 라이브러리는 sockaddr을 사용하므로 라이브러리에 주소 정보를 넘길 떄는 sockaddr로 형변환을 하여 넘긴다.
그러므로 구조체의 크기는 동일하다.
struct sockaddr_in
{
sin_family_t sin_family; //IPv4 주소체계에서 사용하므로 항상 AF_INET으로 설정
unist16_t sin_port; //포트번호
struct in_addr sin_addr //IP주소를 나타내는 32비트 정수 타입 구조체
char sin_zero[8]; //sockaddr과 같은 크기를 유지하기 위해 필요한 패딩공간, 항상 0
}
struct in_addr
{
unit32_t s_addr; //32비트 IPv4 인터넷 주소
}
sin_family : 주소체계 (AF_INET / AF_INET6 / AF_LOCAL)
sin_port : 16비트 포트정보 (네트워크 바이트 오더 적용)
sin_addr : 32비트 IP정보 (네트워크 바이트 오더 적용)
sin_zero : 사용되지 않는 필드
Server / Client 예제
-Server
struct sockaddr_in server_address
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family=AF_INET;
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
server_address.sin_port=htons(PORT);
: INADDR_ANY : 서버에 연결된 네트워크 인터페이스를 목적지로 해서 들어오는 모든 자료를 수신 가능
: htonl, htons : 서버의 주소와 포트 번호는 IP헤더에 저장되어 전송되는데 이를 중계하는 라우터들은 항상 네트워크 바이트 방식,
즉, big endian 으로 처리한다.
-Client
struct sockaddr_in client_address;
memset(&client_address, 0, sizeof(client_address));
client_address.sin_family=AF_INET;
client_address.sin_addr.s_addr=inet_addr("192.168.1.11");
client_address.sin_port=htons(PORT)
: inet_addr() : 문자열을 받아 long형 값을 반환하는데, Network 바이트 형식을 가진다. (htonl 필요없음)