본문 바로가기

Study/TCP/IP

(9)
인터넷 주소 초기화 1: struct sockaddr_in addr; 2: char *serv_ip="111.112.113.114"; 3: char *serv_port="8080" 4: memset(&addr, 0, sizeof(addr_len)); 5: addr.sin_family = AF_INET; 6: addr.sin_addr.s_addr = inet_addr(serv_ip); 7: addr.sin_port = htons(atoi(serv_port)); 1에서 인터넷 주소 정보를 나타내는 구조체 변수 생성. 2와 3에서는 IP 주소와 Port를 선언. 4에서는 memset 함수를 호출해서 인자로 전달되 구조체 변수를 0으로 초기화해 주고 있다. 구조체 변수의 모든 멤버를 적절한 값으로 초기화해 주는 경우 모든 멤버를 ..
인터넷 주소 조작하기 sockaddr_in 안에서 주소를 나타내기 위해 선언되어 있는 멤버의 데이터 타입이 unsigned long이었다. 따라서 우리는 IP 주소 정보를 할당하기 위해 unsigned long 타입으로 IP 주소를 표현할 수 있어야 한다. 하지만 직접 계산하지 않아도 인터넷 주소를 조작해 주는 여러 함수들이 존재한다. Dotted-Decimal Notation의 주소 값을 unsigned long 타입으로 변환해 줄 뿐만 아니라, 네트워크 바이트 순서로의 변환도 알아서 해준다. inet_addr() : Dotted-Decimal Notation을 Big-Endian 32비트 값으로 변환 #include #include #include unsigned long inet_addr(const char *strin..
네트워크 바이트 순서 sockaddr_in 구조체 변수에 값을 대입할 경우에는 네트워크 바이트 순서(Network-byte Ordering)로 값을 변경한 다음에 대입해야 한다. 네트워크 바이트 순서에 대해 이야기 하기전에 바이트 순서의 의미부터 시작해 보자. 바이트 순서라는 것은 시스템이 내부적으로 데이터를 표현하는 방법을 의미한다. 여기서 데이터 표현방식은 모든 시스템이 같은것이 아니다. 크게 두 가지 방법으로 나뉘는데, 하나는 Big-Endian 방식이고 또 하나는 Little-Endian 방식이다. 바이트 순서(Byte Order) Big-Endian은 상위 바이트의 값 이 메모리상에 먼저(번지수가 작은 위치에) 저장되는 순서이며, Little-Endian은 하위 바이트의 값이 메모리상에 먼저(번지수가 작은 위치에) ..
주소 정보의 표현 모든 프로토콜은 자신만의 고유한 주소 포멧이 있다. 예를 들어 IPv4에서는 32비트 주소 체계를 사용하지만, IPv6에서는 128비트 주소 체계를 사용한다. 그러므로 프로토콜에 따라 주소 정보를 나타내는 데이터 타입이 독립적으로 존재한다. 여기서는 IPv4를 중심으로 살펴본다. IPv4의 주소 체계를 나타내는 구조체 struct sockaddr_in { sa_family_t sin_family; /* 주소 체계(address family) */ unit16_t sin_port; /* 16비트 TCP / UDP Port */ struct in_addr sin_addr; /* 32비트 IPv4 주소 */ char sin_zero[8]; /* 사용되지 않음 */ }; struct in_addr { unit3..
Port란, 일반적으로 하나의 컴퓨터 안에서, 여러 개의 어플리케이션이 동시에 네트워크를 통해서 다른 컴퓨터와 데이터를 주고 받는다. 그러나 개인이 사용하는 컴퓨터는 하나의 물리적 연결 장치(네트워크 카드)를 통해서 네트워크에 연결되어 있다. 따라서 하나의 IP 주소를 가지게 된다. 즉, 인터넷을 통해서 데이터를 주고 받는 프로그램이 현재 여러 개 실행 되고 있더라도 데이터를 송, 수신하는 통로는 하나밖에 존재 하지 않는 것이다. IP 주소는 인터넷에 연결되어 있는 컴퓨터들을 구분하여 줄 수는 있어도 컴퓨터 안에서 실행 되고 있는 프로그램까지 구분하여 주지는 못한다. 이를 위해 필요한 것이 바로 Port이다. 32비트 IP 주소로는 네트워크상에 존재하는 호스트를 구분하게 되고, 16비트 Port정보로는 호스트 내에서..
Internet Address IP 주소란, 인터넷상에 존재하는 호스트들을 구분하기 위한 32비트 주소 체계를 의미한다. 일반적으로 점이 찍힌 십진수 표현 방식(Dotted-decimal Notation)을 사용해서 IP 주소를 표현 하는데, 점에 의해 구분되는 각각의 십진수 값은 1바이트로 표현된다. 따라서 총 4 바이트를 사용하게 된다. (XXX.XXX.XXX.XXX) 4바이트 IP 주소는 네트워크 주소와 호스트 주소로 나뉘며, 주소의 형태에 따라 A, B, C, D, E 클래스로 분류할 수 있다. 참고적으로 class E는 일반적이지 않은 예약되어 있는 주소이다. 아래는 주소체계를 나타내는 그림이다. 위 그림과 같이 네트워크 주소는 net-id와 host-id로 구성되어져 있다. 각 클래스별 차이점은 다음과 같다. 클래스 A는 ..
소켓의 생성과 프로토콜의 설정 소켓을 생성 방법을 이해하기 위해서는 프로토콜에 대한 개념이 필요하다. 프로토콜이란 두 개체간에 데이터를 주고 받는 방법에 대한 약속이다. 즉, "컴퓨터 상호간의 대화에 필요한 통신 규약" 이라고 우선은 정의 내릴수 있다. 소켓의 생성 소켓을 생성하기 위해서 리눅스 윈도우즈 공통으로 socket이란 함수를 사용하게 된다. socket 함수는 호출 시 시스템 내부적으로 소켓을 생성하고 그 소켓을 조작하기 위해 필요한 파일 디스크립터를 리턴하는 함수이다. 시스템 내부적으로 소켓을 생성한다는 의미는 호스트가 통신을 하기 위해 필요한 리소스(Re-source)를 할당하는 것을 의미한다. #include #include int socket(int domain, int type, int protocol); 성공 시..
파일 조작하기 리눅스(유닉스 계열 운영 체제)는 모든것(콘솔, 소켓, 파일 등등)을 파일로 간주한다. 소켓 또한 예외가 아니며 우리가 생성하는 소켓도 사용하는 방식이나 내부적으로 처리되는 방식이 파일과 상당 부분 유사하기 때문에 파일 입, 출력 함수를 소켓 입, 출력에 사용할 수 있다. 저 수준 파일 입출력(Low-Level File Access) Low -Level의 의미는 단순히 "시스템이 직접 제공해 주는~" 이라는 의미를 지닌다. 즉 ANSI표준 C에서 정의된 함수들은 아니라는 뜻이다. 파일 디스크립터(File Descriptor) 파일 디스크립터란 시스템으로부터 할당받은 파일이나 소켓을 대표하는 정수를 의미한다. 또한 표준 입력과 표준 출력도 파일 디스크립터로 표현이 되는데 이들은 프로그램이 시작되자마자 기본..