공부한 이야기/윈도우 소켓 프로그래밍

    XI : 소켓 입출력 모델 II

    XI : 소켓 입출력 모델 II TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) Overlapped 모델 (I) : Event 기반 Overlapped 모델은 10장에서 배운 소켓 입출력 모델과는 근본적으로 다른 입출력 방식으로 고성능을 제공한다. 원래 Overlapped 입출력 방식은 윈도우 운영체제에서 고성능 파일 입출력을 위해 제공하는데, 이를 소켓 입출력에도 사용할 수 있게 만든 것이 Overlapped 소켓 입출력 모델이다. 동기 입출력 동기 입출력은 전형적인 입출력 방식으로서, 프로그램은 입출력 함수를 호출한 후 입출력 작업이 끝날 때까지 대기한다. 입출력 작업이 끝나야 입출력 함수가 리턴한다. 10장의 Select 소켓 입출력 모델은 모두 동기 입출력 방식으로 소켓 입출력..

    X : 소켓 입출력 모델 I

    X : 소켓 입출력 모델 I TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) 소켓 입출력 모델 개요 소켓 입출력 모델은 다수의 소켓을 관리하고 소켓 입출력을 처리하는 일관된 방식을 의미한다. 프로그래밍 복잡도는 높아지지만 시스템 자원을 적게 사용하면서도 다수의 클라이언트를 효율적으로 처리하는 서버를 만들 수 있게 된다. 소켓 모드의 종류 블로킹 소켓 소켓 함수 호출 시 조건이 만족되지 않으면 함수가 리턴하지 않고 스레드 실행이 정지된다. 논블로킹 소켓 소켓 함수 호출 시 조건이 만족되지 않더라도 리턴하고 다음 코드를 수행한다. 조건이 만일 만족되지 않는다면 WSAEWOULDBLOCK 코드를 리턴하므로 확인해야 한다. ioctlsocket() 함수를 호출하여 소켓 모드를 변경해야 논블로..

    IX : GUI 소켓 응용 프로그램

    IX : GUI 소켓 응용 프로그램 TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) GUI 응용 프로그램 GUI 응용 프로그램의 핵심 특징은 메시지 구동 구조라는 것이다. 여기에서 메시지는 윈도우 운영체제가 응용 프로그램의 외부 혹은 내부에 변화가 발생했을 때 해당 응용프로그램에 알리는 데 사용하는 개념이다. 외부에서 메시지를 발생시키는 이벤트가 발생하면, 운영체제가 관리하는 시스템 메시지 큐에 정보가 저장된다. 이후 각 GUI 응용 프로그램은 자신의 응용 프로그램 메시지 큐를 이용해서 이 메시지를 전달받아, 하나씩 처리하고 메시지가 없을 때는 대기한다. 메시지를 받았을 때 동작을 결정하는 코드를 흔히 메시지 핸들러라고 부른다. 또 이 메시지 핸들러의 집합을 윈도우 프로시저 라고 부르..

    VIII : 소켓 옵션

    VIII : 소켓 옵션 TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) 소켓 옵션의 종류와 관련 함수 소켓 프로그래밍은 소켓을 통해 TCP/IP, IrDA, Bluetooth와 같은 통신 프로토콜의 기능을 이용하는 응용 프로그램을 작성하는 일이다. 따라서 같은 소켓 함수를 호출하더라도 소켓 코드나 프로토콜 구현 코드의 동작이 달라질 필요가 있다. 이를 위해 소켓 옵션을 사용하면 소켓 함수의 기본 동작을 변경하고 제어할 수 있다. 소켓 옵션은 처리 주체에 따라 크게 두 종류로 구분할 수 있다. 소켓 코드가 처리하는 옵션 옵션을 설정하면 소켓 코드에서 해석하고 처리한다. 프로토콜 독립적인 성격이 있다. 프로토콜 구현 코드가 처리하는 옵션 옵션을 설정하면 프로토콜 구현 코드에서 해석하고 처..

    VII : UDP 서버-클라이언트

    VII : UDP 서버-클라이언트 TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) UDP 서버-클라이언트 구조 TCP와 UDP는 전송 계층 프로토콜이라는 점에서 다음과 같은 공통점이 있다. 포트 번호를 이용해 주소를 지정한다. 데이터 오류를 체크해준다. 하지만 UDP는 비연결형 프로토콜이고 신뢰성이 없다는 점에서 다음 특징을 가진다. 연결 설정을 하지 않으므로 connect() 함수를 사용하지 않는다. 신뢰성이 필요하다면 응용프로그램 수준에서 이를 구현해야 한다. 다자간 통신을 쉽게 구현할 수 있다. 데이터 경계 구분을 위한 작업을 추가로 할 필요가 없다. UDP 서버의 동작은 클라이언트가 보낸 데이터를 recvfrom()을 통해 받고, 처리 후 sendto() 함수를 사용해 클라이언..

    VI : 멀티스레드

    VI : 멀티스레드 TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) 스레드 기초 스레드를 사용하지 않는다면, 서버가 동시에 클라이언트 두 개 이상에 서비스할 수 없다. 또한, 서버와 클라이언트의 send(), recv()가 맞지 않는다면 교착 상태가 발생할 수 있다. 교착 상태란 영원히 일어나지 않을 사건을 두 프로세스/스레드가 기다리는 상황을 의미한다. 소켓에서 여러 클라이언트에게 동시에 서비스를 줄 수 있게끔 기존 설계를 고치려면 여러 방법으로 접근해 볼 수 있다. 서버가 각 클라이언트와 연결해 통신하는 시간을 짧게 줄인다. 즉, 데이터 전송 후 바로 연결을 끊게끔 한다. 이러한 경우 쉽게 구현은 가능하지만, 대용량 데이터에 맞지 않고 클라이언트가 많아진다면 처리 지연 시간이 길어..

    V : 데이터 전송하기

    V : 데이터 전송하기 TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) 응용 프로그램 프로토콜과 데이터 전송 응용 프로그램의 고유 기능을 결정하는 부분은 데이터 처리 부분이다. 어떤 데이터를 어떤 형식으로 주고받고 어떻게 처리할지를 결정하는 것이 개발자가 할 가장 중요한 작업이다. 응용 프로그램 프로토콜은 응용 프로그램 수준에서 주고받는 데이터의 형식과 의미 그리고 처리 방식을 정의한 프로토콜이다. 또한, 이렇게 데이터를 보낼 때 클라이언트와 호스트 간 바이트 정렬을 통일시켜야 올바르게 데이터를 보내고 받을 수 있게 된다. 일반적으로 빅 엔디안 방식으로 통일시킨다. 구조체 멤버 맞춤은 구조체의 패딩을 없앰으로서 읽기 성능을 희생하여 공간 이득을 보는 방법으로서, #pragma pack..

    IV : TCP 서버-클라이언트

    IV : TCP 서버-클라이언트 TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) TCP 서버-클라이언트 구조 TCP 서버-클라이언트의 예로, 웹 서버와 웹 클라이언트인 브라우저가 동작하는 모습이 있다. 서버는 먼저 실행되어 클라이언트가 접속하기를 기다린다 (listen) 클라이언트는 서버에 접속하여 데이터를 보낸다. (connect & send) 서버는 클라이언트 접속을 수용하고 클라이언트의 데이터를 받아 처리한다 (accept & recv) 서버는 처리한 데이터를 클라이언트로 보낸다 (send) 클라이언트는 서버가 보낸 데이터를 받아 처리한다 (recv) 데이터 주고받기가 끝나면 접속을 끊는다 (close) 받은 데이터를 그대로 다시 클라이언트로 되돌려 주는 서버를 에코 서버라고 한..