분류 전체보기
V : 데이터 전송하기
V : 데이터 전송하기 TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) 응용 프로그램 프로토콜과 데이터 전송 응용 프로그램의 고유 기능을 결정하는 부분은 데이터 처리 부분이다. 어떤 데이터를 어떤 형식으로 주고받고 어떻게 처리할지를 결정하는 것이 개발자가 할 가장 중요한 작업이다. 응용 프로그램 프로토콜은 응용 프로그램 수준에서 주고받는 데이터의 형식과 의미 그리고 처리 방식을 정의한 프로토콜이다. 또한, 이렇게 데이터를 보낼 때 클라이언트와 호스트 간 바이트 정렬을 통일시켜야 올바르게 데이터를 보내고 받을 수 있게 된다. 일반적으로 빅 엔디안 방식으로 통일시킨다. 구조체 멤버 맞춤은 구조체의 패딩을 없앰으로서 읽기 성능을 희생하여 공간 이득을 보는 방법으로서, #pragma pack..
IV : TCP 서버-클라이언트
IV : TCP 서버-클라이언트 TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) TCP 서버-클라이언트 구조 TCP 서버-클라이언트의 예로, 웹 서버와 웹 클라이언트인 브라우저가 동작하는 모습이 있다. 서버는 먼저 실행되어 클라이언트가 접속하기를 기다린다 (listen) 클라이언트는 서버에 접속하여 데이터를 보낸다. (connect & send) 서버는 클라이언트 접속을 수용하고 클라이언트의 데이터를 받아 처리한다 (accept & recv) 서버는 처리한 데이터를 클라이언트로 보낸다 (send) 클라이언트는 서버가 보낸 데이터를 받아 처리한다 (recv) 데이터 주고받기가 끝나면 접속을 끊는다 (close) 받은 데이터를 그대로 다시 클라이언트로 되돌려 주는 서버를 에코 서버라고 한..
III : 소켓 주소 구조체 다루기
III : 소켓 주소 구조체 다루기 TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) 소켓 주소 구조체 소켓 주소 구조체는 네트워크 프로그램에서 필요한 주소 정보를 담고 있는 구조체이다. 기본이 되는 것은 SOCKADDR 구조체이며, 정의는 다음과 같다. typedef struct sockaddr { u_short sa_family; char sa_data[14]; } SOCKADDR; sa_family는 주소 체계를 나타내는 16비트 정수 값으로서, AF_INET 또는 AF_INET6 등이 될 수 있다. **sa_data**는 해당 주소 체계에서 사용할 주소 정보를 담게 된다. TCP/IP 환경이라면 IP주소와 포트를 담게 된다. 실제 프로그래밍에서는 별도의 소켓 구조체를 사용하게 된..
II : 윈도우 소켓 시작하기
II : 윈도우 소켓 시작하기 TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) 오류 처리 네트워크 프로그램에서는 여러 이유로 오류가 발생할 수 있기에, 함수 호출 시 오류를 체크하여 사용자나 개발자가 이에 따른 적합한 행동을 취할 수 있도록 해야 한다. 이에 따른 세 가지 오류 처리 방식이 존재한다. 오류를 처리할 필요가 없는 경우 함수의 리턴 값이 없거나, 항상 성공하는 일부 소켓 함수 리턴 값만으로 오류를 처리하는 경우 WSAStartup() 함수가 이에 해당한다. 리턴 값으로 오류 발생 여부만 확인하고, 구체적인 내용은 오류 코드를 받아오는 방식 대부분의 소켓 함수가 이 방식을 사용한다. 따라서 소켓에서 발생하는 대부분의 오류는 WSAGetLastError() 함수를 사용하여 오..
I : 네트워크 소켓 프로그래밍
I : 네트워크 소켓 프로그래밍 TCP/IP 윈도우 소켓 프로그래밍 을 읽고 정리한 문서입니다 ;) TCP/IP 프로토콜 개요 호스트는 최종 사용자 응용 프로그램을 수행하는 주체가 되며, 이는 인터넷에 연결된 PC, 노트북, 휴대전화 등이 해당된다. 라우터는 서로 다른 네트워크에 속한 호스트 간에 데이터를 교환할 수 있게 하는 장비다. 이처럼 데이터를 목적지까지 전달하는 일련의 작업을 라우팅이라고 한다. 호스트와 호스트가 통신하려면 정해진 절차와 방법을 따라야 하는데, 이를 통신 프로토콜이라 한다. 인터넷에서 사용하는 핵심 프로토콜은 TCP와 IP로, 이를 TCP/IP 프로토콜이라 한다. 네트워크 접근 계층은 물리적 네트워크를 통한 실제 데이터 송수신을 담당한다. 이는 물리적인 신호를 처리하는 네트워크 ..
XV : 쓰레드 풀링
XV : 쓰레드 풀링 뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;) 쓰레드 풀에 대한 이해 쓰레드의 생성과 소멸은 시스템에 많은 부담을 준다. 만일 요청받은 작업의 수만큼 쓰레드를 생성하고 처리한 뒤, 쓰레드를 종료시키는 방식이라면 실행 성능은 매우 저하될 것이다. 쓰레드 풀을 유지하는 것은 성능 향상에 도움이 된다. 쓰레드 풀의 기본 원리는 쓰레드의 재활용으로서, 할당된 일을 마친 쓰레드를 소멸시키지 않고 쓰레드 풀에 저장해 뒀다가 필요할 때 다시 쓰는 것이다. 쓰레드 풀은 처리해야 할 일이 등록되기 전에 생성되고, 생성과 동시에 쓰레드들 또한 생성되어 풀에서 대기하게 된다. 지능적인 풀은 처리해야 할 일의 증가 및 감소에 따라서 풀 안의 쓰레드 개수를 늘리기도 하고, 줄이기..
XIV : 쓰레드 동기화 기법 II
XIV : 쓰레드 동기화 기법 II 뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;) 실행순서에 있어서의 동기화 쓰레드의 실행순서를 동기화시킨다는 것은, 정확히는 메모리에 접근하는 쓰레드의 실행순서를 동기화 하는 것이다. 생산자/소비자 모델은 실행되는 쓰레드의 순서가 중요한 상황을 설명할 때 종종 소개되는 모델이다. 이벤트 기반 동기화 Windows 개발자들은 쓰레드의 실행순서를 동기화한다고 하면, 가장 먼저 떠올리는 것이 이벤트 기반 동기화 기법이다. 세마포어나 뮤텍스와 마찬가지로 이 기법에서도 동기화를 위한 오브젝트가 사용되는데, 이를 이벤트 오브젝트라고 한다. HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL..
XIII : 쓰레드 동기화 기법 I
XIII : 쓰레드 동기화 기법 I 뇌를 자극하는 윈도우즈 시스템 프로그래밍 을 읽고 정리한 문서입니다 ;) 쓰레드 동기화란 무엇인가 쓰레드간의 동기화 문제만 잘 처리해도 멀티 쓰레드 프로그래밍에서 발생하는 문제의 대부분을 미리 막을 수 있다. 동기화와 관련된 문제는 컴파일타임에 발생하는 오류가 아니라, 런타임에 발생하는 오류이기에 찾아내고 디버깅하기 매우 어렵기에, 미리 예측하고 동기화를 통해 확실히 방지할 줄 알아야 한다. 동기화라고 하면 보통 무엇인가를 일치시켜 주는 것이라고 통용되지만, 쓰레드에서의 동기화는 순서에 있어서 질서가 지켜지고 있음을 의미하게 된다. 실행순서의 동기화 만일 A 쓰레드가 계산한 결과를 B 쓰레드에서 사용하려고 할 때, 순서가 중요하다. 쓰레드의 실행순서를 정의하고, 이 순..