인터넷 주소 ( Internet address )
- 인터넷 상에서 컴퓨터(Host)를 구분하기 위한 주소
- 4바이트 체계인 IPv4와 16바이트인 IPv6가 있다.
- 네트워크 주소와 호스트 주소로 나뉘며, 네트워크 주소로 네트워크를 찾고
호스트 주소를 이용해 호스트를 구분한다.
- 클래스 A의 첫 한비트는 항상 0으로 시작
- 클래스 B의 첫 두비트는 항상 10으로 시작
- 클래스 C의 첫 세비트는 항상 110으로 시작
포트번호
- 소켓을 구분하는 용도로 사용됨
- 하나의 프로그램 내 둘 이상의 소켓이 존재할수 있다
- 하나의 프로그램에서 둘 이상의 PORT가 할당될수 있다.
- 16비트로 표현 0 ~ 65545의 범위를 가진다.
- 0~1023 포트는 Well-known port라 하여 이미 용도가 정해져 있다.
IPv4 주소표현 구조체
- sin_port와 sin_addr은 네트워크 바이트 순서로 저장함
struct sockaddr_in {
sa_family_t sin_family; - 주소체계
uint16_t sin_port; - 포트번호
struct in_addr sin_addr; - 32비트 IP 주소
char sin_zero[8] - 사이즈 맞추기용 버퍼
}
struct in_addr {
in_addr_t s_addr; - 32비트 IPv4 인터넷 주소
}
sockaddr 과 sockaddr_in의 차이점
struct sockaddr {
u_shortsa_family;/* address family */
charsa_data[14];/* 주소 */
};
- sockaddr은 통신 객체에서 사용하는것이며, 직접 읽거나 작성하기엔 가독성이 떨어져 sockaddr_in 을 사용한다.
- 실제로 사용시 타입캐스팅을 통해 sockaddr로 변환해야 한다.
네트워크 바이트 순서
- 컴퓨터마다 Big-endian과 Little-endian 등으로 데이터 표현, 해석 방식이 다르다
- Big-Endian : 상위 바이트 값을 작은 번지수에 저장
- Little-Endian : 상위 바이트 값을 큰 번지수에 저장
- 이를 해결하기 위해 네트워크 바이트 순서를 사용한다.
- 네트워크 바이트 순서 : 통일된 송수신 기준, 빅엔디안을 사용함
바이트 순서 변환
- 모든 함수는 short를 받고 short를 반환하거나 (2Byte) long을 받고 long을 반환한다 (4Byte)
- hton 혹은 ntoh로 시작하는데 이는 host에서 network로 바꾸거나 network에서 host로 바꾸는것을 의미한다.
- 뒤에는 s나 l이 붙는데 이는 사용되는 자료형을 나타낸다 ( s - short, l - long )
인터넷 주소 할당
- 문자열 정보를 네트워크 바이트 순서의 정수로
- "1.1.1.1"과 과 같이 정수로 표현된 문자열 전달시 이를 32비트 정수형으로 반환
- a : Ascii type
inet_addr : 문자열 IP주소를 받아와 빅-엔디안 정수로 변환
#include <arpa/inet.h>
in_addr_t inet_addr(const char* string);
성공시 빅엔디안 32비트 정수, 실패시 INADDR_NONE 반환
* INADDR_NONE = 0xffffffff
inet_aton : 문자열 IP주소를 받아와 구조체에 저장
#include <arpa/inet.h>
int inet_aton(const char* string, struct in_addr* addr);
성공시 1, 실패시 0 반환
inet_ntoa : in_addr 구조체를 문자열 형태로 변환
#include <arpa/inet.h>
char* inet_ntoa(struct in_addr addr);
성공시 변환한 문자열의 주소, 실패시 -1 반환
인터넷 주소 초기화
- memset으로 구조체 미리 초기화 필요하다.
- sin_family : IPv4 인 AF_INET
- sin_addr.s_addr : 네트워크 바이트 순서 32비트 주소
- sin_port : 네트워크 바이트 순서 16비트 포트
INADDR_ANY
- 내가 쓸수 있는 IP중 아무거나 가져오기.
- htonl(INADDR_ANY) 로 사용 가능하다.
- 서버 구현에 주로 사용한다.
+
setsocketopt