I. sockaddr_in
struct sockaddr_in {
sa_family_t sin_family; //주소체계(Address Family)
unit16_t sin_port; //16비트 TCP/UDP PORT 번호
struct in_addr sin_addr; //32비트 IP주소. 아래 구조체 참고
char sin_zero[8]; //사용되지 않음
};
struct in_addr {
in_addr_t s_addr; //32비트 IPv4 인터넷 주소
};
1. sin_family
주소체계(Address Family) | 의미 |
AF_INET | IPv4 인터넷 프로토콜에 적용하는 주소체계 |
AF_INET6 | IPv6 인터넷 프로토콜에 적용하는 주소체계 |
AF_LOCAL | 로컬 통신을 위한 유닉스 프로토콜의 주소체계 |
2. sin_port
16비트 PORT번호를 네트워크 바이트 순서로 저장한다.
3. sin_addr
32비트 IP주소정보를 네트워크 바이트 순서로 저장한다.
4. sin_zero
특별한 의미를 지니지 않는 멤버이다. 단순히 구조체 sockaddr_in의 크기를 구조체 sockaddr와 일치시키기 위해 삽입된 멤버이다. 반드시 0으로 채워야 한다.
II. 네트워크 바이트 순서
1. CPU의 데이터 저장 방식 Host Byte Order 호스트 바이트 순서
방식 | 의미 | 예: 정수 0x12345678 저장 | |||
0x20번지 | 0x21번지 | 0x22번지 | 0x23번지 | ||
빅 엔디안 Big Endian | 상위 바이트의 값을 작은 번지수에 저장하는 방식 | 0x12 | 0x34 | 0x56 | 0x78 |
리틀 엔디안 Little Endian | 상위 바이트의 값을 큰 번지수에 저장하는 방식 | 0x78 | 0x56 | 0x34 | 0x12 |
네트워크 바이트 순서는 빅 엔디안 방식으로 통일한다!
2. 바이트 순서의 변환 Endian conversions
함수 | 의미 | 용도 |
unsigned short htons(unsigned short) | short형 데이터를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환 | PORT 번호 변환 |
unsigned short ntohs(unsigned short) | short형 데이터를 네트워크 바이트 순서에서 호스트 바이트 순서로 변환 | PORT 번호 변환 |
unsigned long htonl(unsigned long) | long형 데이터를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환 | IP 주소 변환 |
unsigned long ntohl(unsigned long) | long형 데이터를 네트워크 바이트 순서에서 호스트 바이트 순서로 변환 | IP 주소 변환 |
III. 인터넷 주소의 초기화와 할당
1. 문자열정보를 네트워크 바이트 순서의 정수로 변환
#include <arpa/inet.h>
in_addr_t inet_addr(const char* string);
성공 시 빅 엔디안으로 반환된 32비트 정수 값, 실패 시 INADDR_NONE 반환
점이 찍힌 십진수 표현방식 Dotted Decimal Notation에서 32비트 정수형으로 변환해준다. 변환 과정에서 네트워크 바이트 순서로의 변환도 동시에 진행한다.
2. 인터넷 주소의 초기화
1 char* serv_port="3000"; //PORT번호 문자열 선언
2 struct sockaddr_in addr;
3 memset(&addr, 0, sizeof(addr));//구조체 변수 addr의 모든 멤버 0으로 초기화
4 addr.sin_family=AF_INET;//주소체계 지정
5 addr.sin_addr.s_addr=htonl(INADDR_ANY);//IP주소 초기화.
6 addr.sin_port=htons(atoi(serv_port));//문자열 기반의 PORT번호 초기화
INADDR_ANY는 소켓이 동작하는 컴퓨터의 IP주소가 자동으로 할당된다.
'컴퓨터 > C' 카테고리의 다른 글
C accept() (0) | 2022.11.05 |
---|---|
C listen() (0) | 2022.11.05 |
C bind() (0) | 2022.11.04 |
C socket() (0) | 2022.11.03 |
C soket 소켓 생성 과정 (0) | 2022.11.03 |