[Network] 3. 소켓에 할당되는 IP 주소와 PORT 번호
'윤성우의 열혈 TCP/IP 프로그래밍' 서적을 참고하여 정리하였습니다.
인터넷 주소 (Internet Address)
인터넷 상에서 컴퓨터를 구분하는 목적으로 사용되는 주소
IPv4 → 4바이트 주소체계
IPv6 → 16바이트 주소체계
네트워크 주소와 호스트 주소로 나뉜다. 네트워크 주소를 이용해서 네트워크를 찾고, 호스트 주소를 이용해서 호스트를 구분한다.
클래스 별 네트워크 주소와 호스트 주소의 경계
Port 번호
IP는 컴퓨터를 구분하는 용도로 사용되며, PORT번호는 소켓을 구분하는 용도로 사용된다.
PORT번호는 16비트로 표현된다.
0~1023 포트는 이미 용도가 있으며, 포트번호는 0이상 65535이하이다.
IPv4 기반의 주소 표현을 위한 구조체
struct sockaddr_in
{
sa_family_t sin_family;
uint16_t sin_port;
struct in_addr sin_addr;
char sin_zero[8]; //사용하지 않음
};
struct in_addr
{
in_addr_t s_addr;
};
sin_family → 주소 체계 정보 저장 ( AF_INET, AF_INET6, AF_LOCAL )
sin_port → port 번호
sin_addr → 32비트 IP주소
네트워크 바이트 순서
- Big Endian : 상위 바이트의 값을 작은 번지수에 저장함
- Little Endian : 상위 바이트의 값을 큰 번지수에 저장
→ 호스트 바이트는 CPU 별 데이터 저장방식을 의미하고 네트워크 바이트 순서는 통일된 데이터 송수신 기준을 의미한다. (빅 엔디안이 기준)
* 바이트 순서의 변환 함수
htons(unsigned short) : host to network (short)
인터넷 주소의 초기화와 할당
문자열 정보를 네트워크 바이트 순서의 정수로 변환해야한다.
#include <arpa/inet.h>
in_addr_t inet_addr(const char * string)
#include <arpa/inet.h>
int inet_aton(const char * string. struct in_addr*addr)
10진수로 표현된 문자열 주소를 전달하면, 해당 문자열 정보를 참조해서 IP 주소 정보를 32비트 정수형으로 변환한다. inet_addr과 inet_aton가 작동되는 것은 같으나, inet_aton은 in_addr 구조체에 변환 결과가 저장된다는 점이 차이가 있다.
인터넷 주소의 초기화
struct sockaddr_in addr;
char * serv_ip = "211.217.168.13";
char * serv_port = "9190";
memset(&addr, 0, sizeof(addr));
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr(serv_ip);
addr.sin_port=htons(atoi(serv_port));
- INADDR_ANY
addr.sin_addr.s_addr=htonl(INADDR_ANY);
소켓에 인터넷 주소 할당하기
int bind(int sockfd, struct sockaddr*myaddr, socklen_t addrlen);
'Computer Science > Network' 카테고리의 다른 글
[Network] 7. 소켓의 우아한 종료 (0) | 2023.05.28 |
---|---|
[Network] 6. UDP 기반 서버/클라이언트 (0) | 2023.05.28 |
[Network] 5. TCP 기반 서버/클라이언트 2 (0) | 2023.05.28 |
[Network] 4. TCP기반 서버/클라이언트 1 (0) | 2023.05.23 |
[Network] 2. 소켓의 타입과 프로토콜의 설정 (0) | 2023.05.18 |