[Network] 3. 소켓에 할당되는 IP 주소와 PORT 번호

2023. 5. 18. 17:23

'윤성우의 열혈 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);

BELATED ARTICLES

more