분류 전체보기

    [네트워크 프로그래밍/C] TCP 기반 서버, 클라이언트 구현

    TCP 서버 TCP 서버에서의 기본적인 함수 호출 순서 제일 먼저 socket 함수의 호출을 통해 소켓을 생성하고, 주소정보를 담기 위한 구조체 변수를 선언 및 초기화한 후 bind 함수를 호출해 소켓에 주소를 할당합니다. 이 두 단계는 이미 앞선 포스트에서 다뤘으니, 이후의 과정에 대해 다뤄보겠습니다. 연결요청 대기상태로의 진입 bind 함수를 통해 소켓에 주소까지 할당했다면 listen 함수호출을 통해 연결요청 대기상태로 들어갈 차례입니다. listen 함수는 다음과 같은 인자들을 전달받습니다. int sock: 연결요청 대기상태에 두고자 하는 소켓의 파일 디스크립터, 이 함수의 인자로 전달된 디스크립터의 소켓이 서버 소켓(리스닝 소켓)이 됩니다. int backlog: 연결요청 대기 큐의 크기정보,..

    [네트워크 프로그래밍/C] TCP와 UDP에 대한 이해

    인터넷 프로토콜 기반 소켓의 경우, 데이터 전송방법에 따라서 TCP 소켓과 UDP 소켓으로 나뉘고, 특히 TCP 소켓의 경우 연결을 지향하기 때문에 스트림 기반 소켓이라고도 얘기합니다. TCP는 Transmission Control Protocol의 약자로 데이터 전송과정의 컨트롤 이라는 뜻을 지닙니다. 따라서 TCP 소켓의 이해를 위해서는 컨트롤의 방법과 범위에 대해 살펴볼 필요가 있습니다. TCP/IP 프로토콜 스택 TCP가 속해있는 TCP/IP 프로토콜 스택을 먼저 보겠습니다. 위 그림을 통해 TCP/IP 스택이 네 개의 계층으로 나뉨을 알 수 있는데, 이는 데이터 송수신을 네 개의 영역으로 계층화했다는 의미로 받아들일 수 있습니다. 즉 인터넷 기반의 효율적인 데이터 전송이라는 문제를 하나의 덩치 ..

    [네트워크 프로그래밍/C] 인터넷 주소의 초기화와 할당

    문자열 정보를 네트워크 바이트 순서의 정수로 변환하기 sockaddr_in 안에서 주소정보를 저장하기 위해 선언된 멤버는 32비트 정수형으로 정의되어 있습니다. 따라서 우리의 IP주소 정보의 할당을 위해 32비트 정수형태로 IP주소를 표현할 수 있어야 합니다. 그러나 문자열 정보에 익숙한 우리들에게 이는 만만치 않은 일입니다. IP주소 201.211.214.36을 4바이트 정수로 표현했을 때 얼마가 되는지 계산하는 걸 생각해보면 벌써부터 머리가 지끈지끈한 걸 느낄 수 있을 것입니다. 다행히 문자열로 표현 된 IP주소를 32비트 정수형으로 변환해 주는 함수가 있습니다. 뿐만 아니라, 이 함수는 변환과정에서 네트워크 바이트 순서로의 변환도 동시에 진행합니다. // 성공 시 빅 엔디안으로 변환된 32비트 정수..

    [네트워크 프로그래밍/C] 네트워크 바이트 순서와 인터넷 주소 변환

    CPU에 따라서 같은 값을 저장하는 방식이 달라질 수 있습니다. 이런 부분을 고려하지 않고서 데이터를 송수신하면 문제가 발생할 수 있습니다. 저장 순서가 다르다은 것은 전송되어온 데이터의 해석순서가 다름을 뜻하기 때문입니다. 바이트 순서와 네트워크 순서 CPU가 데이터를 메모리에 저장, 해석하는 방식은 다음과 같이 두 가지로 나뉩니다. 빅 엔디안(Big Endian): 상위 바이트의 값을 작은 번지수에 저장 리틀 엔디안(Little Endian): 상위 바이트의 값을 큰 번지수에 저장 0x20번지를 시작으로 4바이트 int형 정수 0x12345678을 저장한다고 가정하고 예시를 들어보겠습니다. 빅 엔디안 방식의 CPU는 다음의 형태로 메모리에 저장합니다. 리틀 엔디안 방식의 CPU는 다음과 같은 방식으로..

    [네트워크 프로그래밍/C] 주소정보의 표현

    IP주소와 PORT 번호 표현을 위한 구조체가 있습니다. 이 구조체를 중심으로 목적지 주소의 표현방법에 대해 알아보겠습니다. 물론 IPv4 기준으로 살펴보겠습니다. IPv4 기반의 주소표현을 위한 구조체 주소정보를 담을 때는 다음 세 가지 물음에 답이 되도록 담아야 합니다. 어떠한 주소체계를 사용하는가? IP주소가 어떻게 되는가? PORT번호가 어떻게 되는가 위의 질문에 답이 되도록 다음과 같은 구조체가 정의되었습니다. 이 구조체는 bind 함수에 주소 정보를 전달하는 용도로 사용됩니다. struct sockaddr_in { sa_family_t sin_family; // 주소체계 (Address Family) uint16_t sin_port; // 16비트 TCP/UDP PORT번호 struct in_..

    [네트워크 프로그래밍/C] 소켓에 할당되는 IP주소와 PORT 번호

    IP는 Internet Protocol의 약자로 인터넷상에서 데이터를 송수신할 목적으로 컴퓨터에게 부여하는 값입니다. 그리고 PORT 번호는 컴퓨터에게 부여하는 값이 아니라 프로그램상에서 생성되는 소켓을 구분하기 위해 소켓에 부여되는 번호를 의미합니다. 인터넷 주소 인터넷에 컴퓨터를 연결해서 데이터를 주고받기 위해서는 IP 주소를 부여받아야 합니다. IP 주소체계는 다음과 같은 종류로 나뉩니다. IPv4(Internet Protocol version 4): 4바이트 주소체계 IPv6(Internet Protocol version 6): 16바이트 주소체계 IPv6는 2010년을 전후로 IP주소가 모두 고갈될 것을 염려해 만들어진 표준인데, 아직도 IPv4가 주로 사용되고 있습니다. IPv4 기준의 4바이..

    [네트워크 프로그래밍/C] 소켓의 프로토콜과 그에 따른 데이터 전송 특성

    프로토콜이란? 멀리 떨어진 두 사람이 대화를 하기 위해서는 나름의 대화방법을 정해야 합니다. 한 사람은 전화로 하고 한 사람은 편지로 대화를 시도한다면 대화가 똑바로 이루어질 리가 없겠죠. 따라서 이 두 사람이 전화로 대화를 하기로 결정하였다면 이 두사람이 대화에 사용한 프로토콜은 전화라고 얘기할 수 있습니다. 이렇듯 프로토콜은 대화에 필요한 통신규약입니다. 컴퓨터의 관점에서 얘기하면 프로토콜은 컴퓨터 상호간의 대화에 필요한 통신규약이라고 할 수 있습니다. 소켓의 생성 앞서 포스팅한 글에서는 소켓과 관련된 함수를 사용하는 코드만 보고 넘어갔었는데, 각 함수에 대해 자세히 설명해보도록 하겠습니다. 아래 함수는 소켓을 생성하는 데 사용하는 함수이고, 전달해야 하는 인자는 다음과 같습니다. int domain..

    [네트워크 프로그래밍/C] 리눅스 기반 파일 조작하기

    네트워크 프로그래밍에서 갑자기 파일을 언급해서 이상하게 생각될 수도 있으나, 리눅스에서 소켓 조작은 파일 조작과 동일하게 간주되므로 파일에 대해 자세히 알 필요가 있습니다. 리눅스는 소켓을 파일의 일종으로 구분합니다. 따라서 파일 입출력 함수를 소켓 입출력에, 다시 말해서 네트워크상에서의 데이터 송수신에 사용할 수 있습니다. 저수준 파일 입출력과 파일 디스크립터 저수준이라는 말만 들어도 어렵다고 느낄 수도 있을텐데, 여기서 말하는 저수준이란 표준에 상관없이 운영체제가 독립적으로 제공한다는 의미입니다. 즉, 지금부터 설명할 함수들은 리눅스에서 제공하는 함수들이고 ANSI 표준에서 정의한 함수가 아니라는 뜻입니다. 파일 입출력 함수를 사용하려면 파일 디스크립터에 대한 개념을 알아야 합니다. 여기서 말하는 파..