■ 모든 프로토콜은 자신만의 고유한 주소 포맷이 있다.


(1) 주소체계를 나타내는 구조체
 
sockaddr 구조체
: 소켓 주소를 표현하는 구제체.
  TCP/IP만을 목적으로 만들어진 것이 아니기 때문에, 다양한 주소체계에 맞게
  범용 목적으로 사용하기 위해 이런 단순한
  구조를 가지고 있다.


      sa_data[4] -> sa_data[14] 수정 (2014.10.06)
 

sockaddr_in 구조체
: IPv4 주소체계에서 사용하는 구조체.
  소켓 프로그램은 범용 주소 구조체로 sockaddr을 사용하지만, 주소체계의 종류에 따라 별도의 전용 구조체를 만들어
  사용하는게 편리하다. (Local Unix 주소 체계는 sockaddr_in을 사용한다.)

- 소켓 라이브러리는 sockaddr을 사용하므로 라이브러리에 주소 정보를 넘길 때는 sockaddr로 형변환을 하여 넘긴다.
- 그러므로 구조체의 크기는 동일하다.

- sin_family : 주소체계 (AF_INET/AF_INET6/AF_LOCAL)
- sin_port : 16비트 포트정보 (네트워크 바이트 오더 적용)
- sin_addr : 32비트 IP 정보 (네트워크 바이트 오더 적용)
- sin_zero : 사용되지 않는 필드

※ 주소체계에 관한 포스팅 자료
  2012/02/27 - [[ Socket ]/Theory] - 프로토콜 체계와 주소체계 - PF_INET, AF_INET

※ 네트워크 바이트 오더에 관한 포스팅 자료
  2011/04/13 - [[ C laguage ]/Theory] - Network Byte Ordering


(2) 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헤더에 저장되어 전송되는데 이를 중계하는 라우터들은 항상 네트워크 바이트 방식.
                      즉, 빅 엔디언으로 처리한다.

○ 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.98");
client_address.sin_port= htons(PORT); 

- inet_addr 함수 : 문자열을 받아 long형 값을 반환하는데, Network 바이트 형식을 가진다. (htonl 필요없음)
 
by 민트앤라떼 2012. 2. 28. 16:58