네트워크 프로그래밍

    [네트워크 프로그래밍/C] 소켓의 다양한 옵션

    소켓의 옵션과 입출력 버퍼의 크기 소켓의 다양한 옵션 지금까지는 소켓을 생성해서 별다른 조작 없이 바로 사용해왔습니다. 이런 경우에는 기본적으로 설정되어 있는 소켓의 특성을 바탕으로 데이터를 송수신하게 됩니다. 그러나 소켓의 특성을 변경시켜야 할 경우도 많습니다. 다양한 소켓의 옵션 중 일부를 보겠습니다. Protocol Level Option Name Get Set SOL_SOCKET SO_SNDBUF O O SO_RCVBUF O O SO_REUSEADDR O O SO_KEEPALIVE O O SO_BROADCAST O O SO_DONTROUTE O O SO_OOBINLINE O O SO_ERROR O O SO_TYPE O X IPPROTO_IP IP_TOS O O IP_TTL O O IP_MULTIC..

    [네트워크 프로그래밍/C] IP 주소와 도메인 이름 사이의 변환

    프로그램상에서 도메인 이름을 쓸 필요가 있는가? 제가 www.justweon.com이라는 도메인을 운영하는 회사의 시스템 엔지니어라고 가정해보겠습니다. 그리고 회사의 서비스 사용을 위한 클라이언트 프로그램을 개발한다고 할 때, 클라이언트 프로그램은 IP가 211.102.204.12이고 PORT가 2022인 주소에 접속해서 서비스를 받도록 설계되어야 합니다. 프로그램 사용자에게는 편리한 실행방법을 제공해야 합니다. 프로그램 사용자가 IP와 PORT를 직접 입력해야만 서비스를 받을 수 있는 프로그램이 되어서는 안되겠죠. 그렇다면 어떻게 위에 말한 주소정보를 프로그램에 삽입할 수 있을까요? 주소 정보를 직접 삽입해서 구현을 해도 물론 정상적이게 작동은 될 것입니다. 그러나 시스템과 관련된 여러 가지 이유로 I..

    [네트워크 프로그래밍/C] Domain Name System

    IP주소와 도메인 이름 사이에서의 변환을 수행하는 시스템을 가리켜 DNS(Domain Name System)이라고 하고, DNS의 중심에는 DNS 서버가 있습니다. 도메인 이름이란? 인터넷에서 서비스를 제공하는 서버들도 IP 주소로 구분이 되는데, 기억하기 쉽지 않은 IP 주소의 형태로 서버의 주소정보를 기억하는 것은 너무 어렵습니다. 따라서 기억하기도 좋고 표현하기도 좋은 형태의 도메인 이름이라는 것을 IP 주소에 부여해서 이것이 IP 주소를 대신하도록 하고 있습니다. DNS 서버 인터넷 브라우저 주소 창에 아래의 IP 중 하나를 입력하면 네이버의 메인 페이지를 볼 수 있습니다. 그러나 일반적으로는 도메인 이름인 www.naver.com 의 입력을 통해 네이버에 접속합니다. 이 두 접속방법은 네이버의 ..

    [네트워크 프로그래밍/C] TCP 기반의 Half-close

    TCP에서는 연결과정보다 중요한 것이 종료과정입니다. 이번 포스트에서 설명할 Half-close는 명확한 종료를 위해 반드시 알아야 할 사항입니다. 일방적 연결종료의 문제점 close 함수호출은 완전종료를 의미합니다. 완전종료라는 것은 데이터 전송은 물론이고 데이터 수신도 더 이상 불가능하게 합니다. 아래 그림을 보며 예시 상황을 하나 살펴보겠습니다. 위 그림은 양방향으로 통신하고 있는 두 호스트의 상황을 묘사한 것입니다. 호스트 A가 마지막 데이터를 전송하고 나서 연결을 종료했습니다. 그 이후부터 호스트 A는 호스트 B가 전송하는 데이터를 수신하지 못합니다(데이터 수신과 관련된 함수 호출 자체가 불가능합니다.). 때문에 호스트 B가 전송한 데이터는 그냥 소멸되고 맙니다. 이러한 문제의 해결을 위해 데이..

    [네트워크 프로그래밍/C] UDP의 데이터 송수신 특성과 UDP에서의 connect 함수호출

    데이터의 경계가 존재하는 UDP 소켓 UDP는 데이터의 경계가 존재하는 프로토콜이므로 데이터 송수신 과정에서 호출하는 입출력 함수의 호출횟수가 큰 의미를 가집니다. 따라서 입력함수의 호출횟수와 출력함수의 호출횟수가 완벽히 일치해야 송신된 데이터 전부를 수신할 수 있습니다. 간단한 예제를 보며 살펴보겠습니다. #include #include #include #include #include #include #define BUF_SIZE 30 void error_handling(char* message); int main(int argc, char* argv[]) { int sock; char message[BUF_SIZE]; struct sockaddr_in my_adr, your_adr; socklen_t..

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

    UDP에서의 서버와 클라이언트의 연결은? UDP 서버, 클라이언트는 TCP와 같이 연결된 상태로 데이터를 송수신하지 않기 때문에 TCP와 달리 연결 설정 과정이 필요가 없습니다. 따라서 TCP 서버 구현과정에서 거쳤던 listen() 함수와 accept() 함수의 호출은 불필요합니다. 소켓의 생성과 데이터의 송수신 과정만 존재할 뿐입니다. UDP에서는 하나의 소켓만? TCP에서는 소켓과 소켓의 관계가 일대일 이었기 때문에 서버에서 열 개의 클라이언트에게 서비스를 제공하려면 문지기의 역할을 하는 서버 소켓을 제외하고도 열 개의 데이터 송수신용 소켓이 더 필요했는데, UDP는 서버건 클라이언트건 하나의 소켓만 있으면 됩니다. 아래 그림을 보면 하나의 UDP 소켓으로 두 곳의 호스트를 대상으로 데이터의 송수신..

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

    UDP 소켓의 특성 UDP의 동작원리를 편지를 예로 들어서 설명해보겠습니다. 편지를 보내기 위해서는 일단 편지봉투에다가 보내는 사람과 받는 사람의 주소정보를 써 넣어야 합니다. 그리고 우표를 붙여서 우체통에 넣어주면 끝인데, 편지의 특성상 보내고 나서 상대방의 수신여부를 확인할 길은 없습니다. 물론 전송도중에 편지가 분실될 확률도 있습니다. 즉, 편지는 신뢰할 수 없는 전송방법입니다. 이와 마찬가지로 UDP 소켓은 신뢰할 수 없는 전송방법을 제공합니다. 여기서 TCP 소켓이 무조건 더 좋은가? 라고 생각할 수 있는데, 물론 TCP가 신뢰성 측면에서는 더 좋은 소켓입니다. 하지만 UDP는 TCP보다 훨씬 간결한 소켓입니다. ACK와 같은 응답 메시지를 보내는 일도 없고, SEQ와 같이 패킷에 번호를 부여하..

    [네트워크 프로그래밍/C] TCP의 이론적 내용

    TCP 소켓에 존재하는 입출력 버퍼 TCP 소켓의 데이터 송수신에는 경계가 없습니다. 따라서 서버가 한 번의 write 함수호출을 통해 한 번에 40바이트를 전송해도 클라이언트는 네 번의 read 함수호출을 통해 나눠서 수신하는 것이 가능합니다. 어떻게 이게 가능한 것인지 궁금할 수 있습니다. 서버가 40바이트를 보내고 클라이언트가 일단 10바이트만 받았다면, 남은 30바이트는 어디에 있는 것일까요? 사실 write 함수가 호출되는 순간이 데이터가 전송되는 순간이 아니고 read 함수가 호출되는 순간이 데이터가 수신되는 순간이 아닙니다. write 함수가 호출되면 데이터는 출력버퍼로 이동을 하고, read 함수가 호출되면 입력버퍼에 저장된 데이터를 읽어들이게 됩니다. 아래 그림을 봅시다. 위 그림에 보이..