1. Internet Address(IPv4)
- 인터넷상에 존재하는 호스트를 구분하기 위한 32비트 주소 체계
* Network ID : 네트워크를 구분짓기 위한 주소.
* Host ID : 호스트들을 구분지어주기 위한 주소.
- 클래스
Class A : Network ID(1Byte) + Host ID(3Byte)
1) 00000000(0) ~ 01111111(127)
ex) 126.1.2.3 = Network ID(126) + Host ID(1.2.3)
Class B : Network ID(2Byte) + Host ID(2Byte)
1) 10000000(128) ~ 10111111(191)
ex) 184.1.1.2 = Network ID(184.1) + Host(1.2)
Class C : Network ID(3Byte) + Host ID(1Byte)
1) 11000000(192) + 11011111(223)
ex) 211.1.1.2 = Network ID(211.1.1) + Host ID(2)
- 루프백 주소(loop back address)
1) 첫번째 바이트가 127인 IP 주소를 의미한다.
2. Port란 무엇인가?
- 호스트 내에서 실행되고 있는 프로세스(Process)를 구분 짓기 위한 16 비트의 논리적 할당(소켓에 할당된다.)
1) 16비트 이므로 값의 범위가 0 ~ 65536 이다.
- Well-known ports : 0 ~ 1023
3. IPv4의 주소체계를 나타내는 구조체
struct sockaddr_in {
sa_family_t sin_family; //주소 체계(AF_INET)
uint16_t sin_port; // port 정보
struct in_addr sin_addr; // 32 비트 IP주소정보
char sin_zero[8]; // 사용되지 않음
};
struct in_addr {
uint32_t s_addr; // 32비트 IP 주소정보
};
* 주의 : 모든 데이터는 네트워크 바이트 순서로 저장 해야 한다.
4. 네트워크 바이트 순서
- 네트워크 바이트 순서는 Big-Endian 방식을 적용하기로 약속
5. 바이트 순서 변환 함수
unsigned short htons(unsigned short);
unsigned short ntohs(unsigned short);
unsigned long htonl(unsigned long);
unsigned long ntohl(unsigned long);
'h' : host byte order
'n' : network byte order
's' : short (16 bit)
'l' : long (32 bit)
6. 인터넷 주소 조작 함수
- FROM Dotted-Decimal Notation To Big-Endian 32 비트 정수형 데이터 (Network)
unsigned long inet_addr(const char * string)
- FROM Big-Endian 32비트 정수형 데이터 (Network) TO Dotted-Decimal Notation
char & inet_ntoa(struct in_addr addr)
7. 인터넷 주소 초기화 Template
1) struct sockaddr_in addr;
2) char *serv_ip="211.217.168.13";
3) char *serv_port="9190";
4) memset(&addr, 0, sizeof(addr_len)); // 첫번째 인자로 전달된 포인터가 가리키는 대상을 sizeof(addr_len)크기만큼 0으로 초기화.
5) addr.sin_family = AF_INET; // IPv4 기반의 데이터를 저장.
6) addr.sin_addr.s_addr = inet_addr(serv_ip); // 초기화 해놓은 10진수의 아이피를 정수형 데이터로 변환하여 저장.
7) addr.sin_port = htons(atoi(serv_port)); // serv_port에 저장된 문자열을 atoi함수에 의해서 정수로 변환 한뒤 네트워크 바이트 순서로 저장.
8. 주소 정보 할당하기
#include <sys/type.h>
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr * myaddr, int addrlen);
(리눅스)
#include <winsock2.h>
int bind(SOCKET s, const struct sockaddr FAR *name, int namelen);
(윈도우)
'[+] Information > [-] Network' 카테고리의 다른 글
[2009/05/30] TCP/IP 프로토콜 스택 (0) | 2009.05.30 |
---|---|
[2009/05/27] 예제소스(endian_conv.c, endian_conv_win.c, inet_ntoa.c, inet_addr.c, bind_sock_win.c, bind_sock.c) (0) | 2009.05.27 |
[2009/05/26] 예제소스(make_socket_linux.c, make_socket_win.c) (0) | 2009.05.26 |
[2009/05/26] 소켓의 생성과 프로토콜의 설정 (0) | 2009.05.26 |