본문 바로가기

컴퓨터

sockaddr_in

출처: 열혈강의 TCP IP 소켓 프로그래밍


설명
IPv4의 주소 체계를 나타내는 구조체


문법

struct sockaddr_in {

  sa_family_t sin_family; 

  uint16_t sin_port; 

  struct in_addr; 

  char sin_zero[8]; 

};

멤버
sin_family: 프로토콜 체계마다 다른 주소체계

주소체계(Address Family)

정의

AF_INET

IPv4 인터넷 프로토콜

AF_INET6

IPv6 인터넷 프로토콜

AF_LOCAL

Local 통신을 위한 UNIX 프로토콜

sin_port: 16비트 Port 정보를 대입해 준다. 네트워크 바이트 순서로 대입해야 한다. (즉, Big-Endian)
sin_addr: 32비트 IP 주소 정보를 대입해 준다. 역시 네트워크 바이트 순서로 대입해야 한다.
sin_zero: 특별한 의미 없이 단순한 채워주기(padding) 위한 목적으로 사용되는 구조체 멤버이다.

바이트 순서(Byte Order)
    - Big-Endian: 상위 바이트의 값이 메모리상에 먼저(번지수가 작은 위치에) 표시되는 방법. 네트워크 바이트 순서. Motorola 68000계열 시스템에서도 사용됨.
    - Little-endian: 하위 바이트의 값이 메모리상에 먼저(번지수가 작은 위치에) 표시되는 방법. Intel x86계열 시스템에서도 사용됨.

초기화

1: struct sockaddr_in addr;
2: char *serv_ip = "211.217.168.13";
3: char *serv_port = "9190";
4: memset(&addr , 0, sizeof(addr_len);
5: addr.sin_family = AF_INET;
6: addr.sin_addr.s_addr = inet_addr(serv_ip);
7: addr.sin_port = htons(atoi(serv_port);

1 인터넷 주소 정보를 나타내는 구조체 변수 생성.
2,3 IP 주소와 Port 를 선언.
4 memset 함수를 호출해서 인자로 전달된 구조체 변수를 0 으로 초기화.
5 프로토콜 체계 설정
6 IP 주소 스트링을 네트워크 바이트 순서로 된 32비트 IP값으로 변환하여 대입.
7 atoi 함수를 사용하여 스트링을 정수 값으로 바꾸어 주고, 다시 htons 함수를 통해 네트워크 바이트 순서로 변환.

1: struct sockaddr_in addr;
2: char *serv_port = "9190";
3: memset(&addr , 0, sizeof(addr_len);
4: addr.sin_family = AF_INET;
5: addr.sin_addr.s_addr = htonl(INADDR_ANY);
6: addr.sin_port = htons(atoi(serv_port);

INADDR_ANY 상수를 통해서 주소를 할당하고 있다. 이러한 초기화 방법을 사용할 경우 현재 시스템의 IP 주소를 자동적으로 찾아서 할당해 주기 때문에 시스템의 IP 주소를 찾는 수고를 덜 수 있다.

'컴퓨터' 카테고리의 다른 글

memset  (0) 2019.02.26
inet_addr  (0) 2019.02.26
closesocket  (0) 2019.02.24
WSACleanup  (0) 2019.02.24
MAKEWORD  (0) 2019.02.24