일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- SK바이오사이언스
- 에라토스테네스의 체
- margin
- Prefix Sums
- skt membership
- align-items
- c
- Codility
- 확률
- Javascript
- c++
- 포토샵
- Gap
- 수학
- 소수
- spring
- stl
- 알고리즘
- CSS
- Photoshop
- Design Pattern
- pandas
- dataframe
- 백준
- 상태
- Flexbox
- grid
- 통신사할인
- 강화학습
- 미디어 쿼리
Archives
- Today
- Total
sliver__
[3장] 주소체계와 데이터 정렬 본문
728x90
- 인터넷 주소란?
- 인터넷상에서 컴퓨터를 구분하기 위한 주소
- 4바이트 주소 체계인 IPv4, 16바이트 주소체계인 IPv6
- 소켓을 생성할 때 기본적으로 프로토콜을 지정해야 한다.
- 네트워크 주소와 호스트주소로 나뉜다. 네트워크 주소를 사용하여 네트워크 주소를 찾고, 호스트 주소를 사용해서 호스트를 구분한다.
- IPv4 주소 체계
클래스 | 네트워크 주소 범위 | 시작 비트 |
A | 0~127 | 0 |
B | 128~191 | 10 |
C | 192~223 | 110 |
D | N/A | N/A |
- 첫 번째 바이트를 보고 네트워크 주소 클래스를 구분하고 호스트 주소를 구한다.
- PORT 번호
- IP는 컴퓨터를 구분하는 용도, PORT는 소켓을 구분하는 용도
- 하나의 프로그램에 둘 이상의 소켓 존재 가능
- PORT는 16비트, 0 ~ 65535 가능
- 0~1023은 Well-known 포트로 사용 불가능
- IPv4 사용을 위한 구조체
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주소
};
#define in_addr_t uint32_t
#define in_port_t uint16_t
- sin_family
- 주소체계 정보 저장
NUM | 주소 체계 | 설명 |
1 | AF_INET | IPv4 |
2 | AF_INET6 | IPv6 |
3 | AF_LOCAL | LOCAL UNIX |
- sin_port
- 16비트 PORT 저장
- 네트워크 바이트 순서로 저장
- sin_addr
- 32비트 IP 주소 저장
- 네트워크 바이트 순서로 저장
- sin_zero
- 의미 없음
- 0으로 채워져야만 한다.
- 구조체 변수 sockaddr_in 은 bind함수 인자로 전달되는데, 매개변수 형이 sockaddr이므로 형 변환을 해야만 한다.
struct sock_addr
{
sa_family_t sin_family; // 주소체계
char sa_data[14];// 주소정보
};
- sock_addr은 다양한 주소체계를 저장하기 위해 정의되었다.
- sockaddr_in을 사용하여 편리하게 IPv4 주소정보를 담을 수 있다.
- CPU에 따라 상위바이트를 하위 메모리 주소에 저장할 수 있고, 상위 메모리 주소에 저장할 수 있다.
- 빅 엔디안
- 상위 바이트 값을 작은 번지수에 저장
- 리틀 엔디안
- 상위 바이트 값을 큰 번지수에 저장
- 호스트 바이트 순서
- CPU 별 데이터 저장 방식 의미
- 네트워크 바이트 순서
- 통일된 데이터 송수신 기준을 의미
- 빅 엔디안이 기준
- 바이트 순서 변환
- unsigned short htons(unsigned short)
- unsigned short ntohs(unsigned short)
- unsigned long htonl(unsigned long)
- unsigned long ntonl(unsigned long)
- 문자열 정보 -> 네트워크 바이트 순서의 정수로 변환
NUM | 함수 | Return value (SUCCESS / FAIL) |
설명 |
1 | in_addr_t inet_addr(const char* string) | 빅 엔디안으로 변환된 32비트 정수 / INADDR_NONE | 파라미터 string을 32비트 정수로 변환 |
2 | int inet_aton(const char* string, struct in_addr *addr) | 1 / 0 | string을 빅엔디안 32비트로 정수로 변환하여 addr에 저장 |
3 | char* inet_ntoa(struct in_addr adr) | 변환된 문자열의 주소 값 / -1 | adr에 저장된 빅엔디안 32비트 정수를 문자열로 변환 |
- INADDR_ANY
- 현재 실행중인 컴퓨터 IP를 소켓에 부여
- 소켓에 인터넷 주소 할당
NUM | 함수 | Return value (SUCCESS / FAIL) |
설명 |
1 | int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen) | 0 / -1 | sockfd에 주소정보를 할당 |
728x90
'CS > TCP_IP' 카테고리의 다른 글
[1장] 소켓 프로그래밍 이해 (0) | 2023.06.23 |
---|
Comments