분류 전체보기 130

1장 네트워크 프로그래밍과 소켓의 이해

네트워크 프로그래밍과 소켓의 이해 네트워크로 연결되어 있는 서로 다른 두 컴퓨터가 데이터를 주고받을 수 있도록 하는 것이 네트워크 프로그래밍이다. 네트워크로 연결되어 있는 두 컴퓨터간에 데이터를 주고받기 위해 필요한 것 물리적인 연결 물리적인 연결을 기반으로 하는 소프트웨어적인 데이터의 송수신 방법 ( 운영체제에서 '소켓(Socket)'이라는 것을 제공 ) 소켓은 물리적으로 연결된 네트워크상에서 데이터 송수신에 사용할 수 있는 소프트웨어적인 장치를 의미한다. 전화기의 장만에 비유되는 socket 함수호출의 이해 전화기에 해당하는 소켓을 생성하는 함수 #include int socket(int domain, int type, int protocol); // 성공 : 파일 디스크립터 // 실패 : -1 반환..

목차

네트워크 프로그래밍과 소켓의 이해 네트워크 프로그래밍과 소켓의 이해 리눅스 기반 파일 조작하기 윈도우 기반으로 구현하기 윈도우 기반의 소켓관련 함수와 예제 소켓의 타입과 프로토콜의 설정 소켓의 프로토콜과 그에 따른 데이터 전송 특성 윈도우 기반에서 이해 및 확인하기 주소체계와 데이터 정렬 소켓에 할당되는 IP주소와 PORT번호 주소정보의 표현 네트워크 바이트 순서와 인터넷 주소 변환 인터넷 주소의 초기화와 할당 윈도우 기반으로 구현하기 TCP 기반 서버/클라이언트 1 TCP와 UDP에 대한 이해 TCP기반 서버, 클라이언트 구현 Iterative 기반의 서버, 클라이언트 구현 윈도우 기반으로 구현하기 TCP 기반 서버/클라이언트 2 에코 클라이언트의 완벽 구현 TCP의 이론적인 이야기 윈도우 기반으로 구..

10장 소켓 입출력 모델(II)

Overlapped 모델(1) Overlapped 모델은 지금까지 배운 다른 소켓 입출력 모델과는 근본적으로 다른 입출력 방식으로, 고성능을 제공한다. 또한 동작 방식에 따라 크게 두 종류의 작성 방법을 지원한다. 동작 원리 원래 Overlapped 입출력 방식은 윈도우 운영체제에서 고성능 파일 입출력을 위해 제공하는데, 이를 소켓 입출력에서도 사용할 수 있게 만든 것이 Overlapped 모델이다. 위의 그림은 동기 입출력(synchronous I/O)라고 부른다. 애플리케이션은 입출력 함수를 호출한 후 입출력 작업이 끝날 때까지 대기한다. 입출력 작업이 끝나면 입출력 함수는 리턴하고 애플리케이션은 입출력 결과를 처리하거나 다른 작업을 진행할 수 있다. Select, WSAAsyncSelect, WSA..

9장 소켓 입출력 모델(I)

개요 좀더 많은 클라이언트 접속을 효율적으로 처리하려면 새로운 입출력 모델이 필요하다. 소켓 모드 소켓은 소켓 함수 호출 시 동작 방식에 따라 블로킹(blocking)과 넌블로킹(nonblocking)소켓으로 구분하며, 이를 소켓 모드(socket mode)라고 부른다. 블로킹 소켓 특징 소켓 함수 호출 시 조건이 만족되지 않으면 함수는 리턴하지 않고 해당 스레드는 대기 상태(wait state)가 된다. 대표적인 소켓 함수와 리턴 조건은 다음과 같다. 소켓 함수리턴 조건accept( )클라이언트가 접속했을 때send( ), sendto( )송신 버퍼에 데이터를 모두 복사했을 때recv( ), recvfrom( )수신 버퍼에 도착한 데이터가 있을 때이러한 조건이 만족되지 않으면 소켓 함수는 리턴하지 않으..

7장 소켓 옵션

개요 소켓 프로그래밍이란 아래 그럼에서 보는 것과 같이 소켓을 통해 간접적으로 TCP, IP등과 같은 하부 프로토콜을 다룸으로써 애플리케이션을 작성하는 것을 의미한다. 이와 같은 관점에서 보면, 애플리케이션은 소켓 코드가 제공하는 인터페이스인 소켓 함수를 호출함으로써 하부 프로토콜이 제공하는 다양한 기능을 사용하는 것이다. 지금까지 다룬 모든 소켓 애플리케이션은 특별한 변경 없이 소켓 함수를 그대로 호출함으로써 구현하였다. 그러나 다양한 애플리케이션을 작성하다보면, 동일한 소켓 함수를 호출하더라도 소켓 코드나 프로토콜 구현 코드의 동작이 달라지도록 할 필요가 생긴다. 소켓 옵션(socket option)을 적용하면 소켓 함수의 기본 동작을 변경할 수 있으며, 이를 이용하여 애플리케이션은 소켓 코드와 프로..

6장 UDP 서버/클라이언트

UDP 서버/클라이언트 구조 TCP와 UDP 프로토콜은 전송 계층 프로톸ㄹ이라는 점에서 다음과 같은 공통점을 지닌다 포트 번호를 이용하여 주소를 지정한다 두 애플리케이션이 통신하기 위해 반드시 포트 번호를 결정해야 한다 데이터 오류를 체크한다 IP가 제공하는 오류 체크 기능은 프로토콜 동작을 위해 반드시 필요한 부분에만 국한된다. 즉 IP헤더에 대한 오류는 체크하지만 데이터에 대한 오류는 체크하지 않는다. 반면, TCP와 UDP는 헤더와 데이터에 대한 오류를 체크한다. TCP와 UDP의 차이점은 다음과같다. 항목 TCP UDP 1 연결형(connection-oriented) 프로토콜 연결이 성공해야 통신 가능 비연결형(connectionless) 프로토콜 연결 없이 통신 가능 2 데이터 경계를 구분하지 ..

5장 멀티스레드

멀티스레드 기초 4장에서 다룬 TCP 서버/클라이언트 예제는 다음과 같은 문제가 있다 두 개 이상의 클라이언트가 서버에 접속할 수 있으나, 서버가 동시에 두 개 이상의 클라이언트에 대한 서비스를 할 수 없다. 서버와 클라이언트의 send( ), recv( )함수 호출 순서가 서로 맞아야 한다. 데이터를 보내지 않은 상태에서 양쪽에서 동시에 recv( )함수를 호출할 경우 교착 상태가 발생할 수 있다. 여기서 교착 상태(deadlock)란 영원히 일어나지 않을 사건을 두 프로세스가 기다린느 상황을 뜻한다. 아래 경우 두 프로세스가 recv( )함수에서 빠져 나가지 못하고, 이로 인해 send( )함수를 호출할 수 없으므로 교착 상태가 발생한다. 첫 번째 문제점에 대한 해결책과 각각의 장단점은 다음과 같다 ..

4장 TCP 서버/클라이언트 구조

TCP 서버/클라이언트 구조 PC에서 사용하는 대표적인 웹 클라이언트인 인터넷 익스플로러는 사용자가 입력한 주소를 참조하여 접속 대기 중인 웹 서버에 접속한 후, HTTP를 이용하여 요청 메시지를 보낸다. 웹 서버는 이 데이터를 분석한 후 HTTP를 이용하여 응답 메시지를 다내 보낸다. 익스플로러는 웹 서버가 보낸 데이터를 받아 화면에 표시한다. HTTP는 TCP에 기반한 프로토콜이므로 웹 서버/클라이언트는 대표적인 TCP 서버/클라이언트 애플리케이션이라고 할 수 있다. TCP 서버/클라이언트 동작 방식은 다음과 같다 서버는 먼저 싱행하여 클라이너트가 접속하기를 기다린다(listen) 클라이언트가 서버에 접속(connet)하여 데이터를 보낸다(send) 서버는 클라이언트 접속을 수용하고(accept), ..

3장 소켓 주소 구조체 다루기

소켓 주소 구조체 정의 소켓 주소 구조체(socket address structures)는 네트워크 프로그램에서 필요로 하는 주소 정보를 담고 있는 구조체로, 다양한 소켓 함수의 인자로 사용한다. 여러 소켓 주소 구조체 중 가장 기본이 되는 것은 SOCKADDR로 구조체 정의는 다음과 같다 typedef struct sockaddr { u_short sa_family; CHAR sa_data[14]; } SOCKADDR, *PSOCKADDR, *LPSOCKADDR; sa_family 주소 체계를 나타내며, 부호 없는 16비트 정수값을 사용한다. 예를 들어, TCP/IP프로토콜을 사용한다면 이 값은 AF_INET이 된다. sa_data[14] 해당 주소 체계에서 사용하는 주소 정보를 담고 있다. 주소 체계..

2장 윈도우 소켓 시작하기

오류 처리 네트워크 프로그램에서는 여러 원인으로 인해 오류가 발생할 수 있으며, 발생 활률 또한 비교적 높은 편이다. 따라서 함수 호출 시 오류 처릴르 철저히 하는 것은 물론, 구체적인 오류 내용을 사용자에게 알려주는 것은 매우 중요하다. 윈속 함수는 오류 처리 방법에 따라 다음과 같이 세 가지 유형으로 나눌 수 있다. 오류 처리를 할 필요가 없는 경우 리턴값이 없거나 호출 시 항상 성공하는 일부 소켓 함수 리턴값으로 오류를 처리하는 경우 WSAStartup() 함수 리턴값으로 오류 발생을 확인하고, 구체적인 내용은 오류 코드를 이용하여 확인하는 경우 대부분의 소켓 함수 소켓 함수 호출 결과 오류가 발생했다면 WSAGetLastError( ) 함수를 이용하여 오류 코드를 얻을 수 있다. int WSAGe..