출처: 열혈강의 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 |