본문 바로가기

윈도우 소켓 프로그래밍
[소켓프로그래밍] 6. 스레드 동기화 (임계 영역, 이벤트) 이 게시글은 'TCP/IP 윈도우 소켓 프로그래밍 (김선우 저, 한빛아카데미)'를 공부한 내용을 기반으로 작성됨 멀티스레드를 이용하는 경우, 두 개 이상의 스레드가 공유 데이터에 접근하면 여러 문제가 발생할 수 있다. 예를 들어 공유 변수 int money = 1000이 존재한다고 할 때, 스레드 #1이 money에 2000을 더하여 money = 3000이 되었다고 해보자. 이때 스레드 #2가 money = 3000이 되기 전에 이미 money를 read 해놓은 상태라고 해보자. 스레드 #2 입장에서는 money = 1000이기 때문에, 만약 이에 3000을 더해준다면 money = 4000이 된다. 이러한 상황이 발생하면 스레드 #1의 명령이 무시되는 것이므로, 오류로 볼 수 있다. 이러한 멀티스레드..
[소켓프로그래밍] 5. 스레드, 멀티스레드, 스레드 제어 이 게시글은 'TCP/IP 윈도우 소켓 프로그래밍 (김선우 저, 한빛아카데미)'를 공부한 내용을 기반으로 작성됨 직전 게시글에서 수행했던 TCP Server-Client 예제는 다음과 같은 문제를 갖는다. 여러 개의 Client가 Server에 접속하는 것은 가능하나, Server가 동시에 여러 Client에 서비스하는 것은 불가능하다. 예를 들어 두 개의 Client가 하나의 Server에 접속되어 있다면 먼저 접속한 Client가 Server에 전송한 메시지는 수신되지만, 늦게 접속한 Client가 전송한 메시지는 Server가 수신할 수 없다.이는 서버에 접속한 각 클라이언트들을 스레드를 이용하여 독립적으로 처리하여 해결한다. (멀티스레드)멀티스레드는 소켓 입출력 모델에 비해 비교적 쉽게 구현할 수..
[소켓프로그래밍] 4. 고정길이, 가변길이 데이터 TCP 통신 / 데이터 전송 후 종료 이 게시글은 'TCP/IP 윈도우 소켓 프로그래밍 (김선우 저, 한빛아카데미)'를 공부한 내용을 기반으로 작성됨TCP Server-client의 기본 구조는 직전 게시글에서 다룬 구조로 정해져 있다.따라서 직전 게시글의 코드 구조를 한 번 이해하고 나면 이를 마스터 코드로 두고 그대로 재사용 할 수 있다.그렇다면, 마스터 코드의 어느 부분을 바꾸어야 또 다른 응용 프로그램을 만들 수 있는 것일까?바로 '데이터 처리' 부분이다. 어떤 데이터를 어떤 형식으로 주고 받으며 처리할지를 결정하는 것이 바로 네트워크 응용 프로그램 개발자의 역할이다.  이번 게시글에서는 직전 게시글의 마스터 코드를 기반으로 고정길이 데이터 전송과 가변길이 데이터 전송을 수행해보도록 한다.고정길이 데이터 전송은 Server와 Clie..
[소켓프로그래밍] 3. TCP 서버 클라이언트 통신 이 게시글은 'TCP/IP 윈도우 소켓 프로그래밍 (김선우 저, 한빛아카데미)'를 공부한 내용을 기반으로 작성됨 책 2부로 넘어오자마자 굉장히 재밌는 실습이 나를 반긴다.. 그것은 바로 TCP server-client 통신   TCP server-client 통신은 위 도식과 같이 진행된다. 차례대로 알아보도록 하자. Server - socket() : socket()은 네트워크 프로그래밍에서 '소켓'을 생성하기 위한 함수. 소켓은 네트워크 통신의 endpoint를 의미하며, 소켓을 통해 서버-네트워크 혹은 컴퓨터-컴퓨터 간 데이터 통신이 가능해진다.Server - bind() : bind()는 소켓을 특정 IP 주소의 포트 번호에 연결하기 위해 사용됨. 소켓을 생성한 후에, 서버 소켓이 특정 IP 주소..
[소켓프로그래밍] 1. 소켓 생성과 닫기, 바이트 정렬 이 게시글은 'TCP/IP 윈도우 소켓 프로그래밍 (김선우 저, 한빛아카데미)'를 공부한 내용을 기반으로 작성됨  #define _WINSOCK_DEPRECATED_NO_WARNINGS // winsock c4996 처리#include #include #include using namespace std;#pragma comment(lib,"ws2_32.lib") // ws2_32.lib 라이브러리를 링크void err_quit(LPCTSTR msg){ LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRA..