windows 썸네일형 리스트형 C언어의 메모리 구조(Data, Heap, Stack) 프로그램이 OS에 의해 실행되어 프로세스가 되면 이 프로세스는 메모리 공간을 할당받는다. 프로세스에 할당되는 메모리 공간은 Data, Heap, Stack영역으로 나뉜다. Data 영역: 전역변수와 static변수가 할당되는 영역. 전역변수와 static변수는 프로그램이 시작되면 할당되고 종료되면 메모리에서 소멸된다. Heap 영역: 메모리 공간을 동적할당할 때 할당되는 영역. 프로그램 시작시에 정해진 stack영역과는 달리 프로그램 실행 도중(런타임시)에 할당되는 영역이다. Stack 영역: 함수 내의 지역변수와 매개변수가 저장되는 영역. 함수가 호출될 시 생성되고 호출이 완료되면 사라진다. 이 stack영역에 얼만큼의 메모리 공간이 할당될지는 컴파일 시에 결정된다. 함수가 여러번 재귀로 호출되면 이 .. 더보기 /MT /MD 옵션의 차이 /MT와 /MD의 차이 /MTd는 /MT의 디버그버전. 마찬가지로 /MDd는 /MD의 디버그 버전. /MT: 내가 만드는 응용 프로그램이 C런타임 라이브러리의 기능을 사용할 때 static link version인 LIBCMT.lib를 사용하여 프로그램이 빌드된다는 뜻. /MD: 내가 만드는 응용 프로그램이 C런타임 라이브러리의 기능을 사용할 때 dynamic link version인 MSVCRT.lib를 사용하여 프로그램이 빌드된다는 뜻. 즉 내가 dll을 만들든 .lib를 만들든 그냥 .exe를 만들든 이 옵션은 아무거나 골라도 상관이 없음. 문제는 .lib를 가져다가 쓰는 경우 이 /MT /MD옵션이 맞지 않으면 'XXX is already defined in YYY’같은 에러가 뜨면서 컴파.. 더보기 .lib와 .dll의 차이 동적 라이브러리(.dll) 프로그램 실행 시 필요시만 DLL 파일에서 함수를 참조 프로그램 실행 시 DLL을 모두 로드하지 않기 때문에 프로그램 로딩 시간이 단축 함수 업그레이드 시 해당 DLL만 수정 배포하면 되기때문에 용이 소스 외부 유출 방지 효과 .exe 파일 만들때 필요한 파일: .h,.lib (*.dll 참조 용). dll자체는 필요 없다. .exe 파일 실행할 할 때 필요한 파일: *.dll (배포할 때 *.dll 필요) dll 제작 시 lib도 같이 생성됨(dll 참조용) 정적 라이브러리(.lib) 필요한 함수를 프로그램 코드에 붙여 컴파일 시 프로그램 자체에서 참조 프로그램 실행 후 빠른 처리시간 컴파일 시 .lib는 .exe내부에 모두 녹아 들어가므로 프로그램 .exe파일만 있으면 .l.. 더보기 윈도우 서비란 무엇인가? 서비스 만들기 서비스란 무엇인가? 윈도우 기동 과정: 부팅 > 드라이버 로딩 > 서비스 로딩 > 로그온 > 응용 프로그램 로딩 위에서 보듯 사용자 로그온 전에 서비스가 먼저 로딩된다. 서비스는 일반적으로 Local System Account로 구동되기 때문에 시스템을 제어하는데 강력한 권한을 가진다. 일반 사용자 계정으로 구동도 가능한데 service.msc에 들어가 서비스 속성의 Log On탭에서 바꿔줄 수 있다.(혹은 .exe프로그램 코딩할 때 WINAPI CreateService() 함수의 인자를 이용해서 바꿔줄 수 있다.) 서비스는 시스템 경로에 파일 읽기/쓰기, 로컬 시스템 레지스트리 엑세스와 같은 모든 작업을 할 수 있는 권한이 있고 UAC에 영향을 받지 않고 돌아가는 장점을 가진다. 서비스 또한 근본적으로.. 더보기 IOCP model(Chat Server) - Code SockIOCP.h #pragma once #include #pragma comment(lib,"ws2_32") DWORD WINAPI ThreadCompletion(LPVOID pParam); typedef struct _USERSESSION{ SOCKET hSocket; SOCKADDR_IN clientAddr; }USERSESSION; typedef struct _PERIODATA{ OVERLAPPED ov; WSABUF wsabuf; char buffer[1024]; bool isRecv; }PERIODATA; class SockIOCP { public: SockIOCP(void); ~SockIOCP(void); public: HANDLE m_hIOCP; int m_nThreadCount; SOC.. 더보기 IOCP model(Server) - Idea Overlapped IO 개념: 기본적으로 IO는 동기방식이다. ReadFile()하면 디스크에서 파일이 다 읽어질때까지 CPU는 대기한다. 이게 성능저하를 초래하기 때문에 비동기로 IO를 처리하는 방법인 Overlapped IO이다. 비동기로 여러번 데이터를 전송하면 데이터 전송이 중첩된다는 의미로 Overlapped형태라고 한다. 원리: 비동기 방식으로 WSASend()를 호출하면 이 IO처리의 책임이 쓰레드에서 Device Driver로 넘어간다. 즉 IO처리는 Driver가 담당하고 쓰레드는 다른 작업을 계쏙 진행할 수 있다는 것이다. Device Driver는 IO처리가 끝나면 이를 다시 쓰레드에 알려줘야 하는데 OVERLAPPED 구조체에 있는 이벤트 객체를 통해서 알려주기도 하고 아니면 지정.. 더보기 Basic model(Chat Client) - Code ConsoleChatClient.cpp #include "stdafx.h" #include #pragma comment(lib,"ws2_32") DWORD WINAPI ReceiveThread(LPVOID pParam) { //무한 수신을 해야한다. 종료되지 말고. SOCKET hSocket = (SOCKET)pParam; char szBuffer[32] = {0,}; while(1) //종료되지 말아야 하니까 while루프.. { memset(szBuffer,0,sizeof(szBuffer)); ::recv(hSocket,szBuffer,sizeof(szBuffer),0); //여기도 recv함수가 블라킹이니까 한번 받고 한바퀴 돌고 다시 대기 printf("From Server: %s\n", szBu.. 더보기 Basic model(Client) - Idea WSAStartup(): 윈속 초기화 함수 WSAStartup(): WS2_32.DLL을 메모리에 로드(초기화) 하는 함수. WSAClenup(): 윈속 함수 사용중지를 알리고 리소스를 반환하는 함수. socket(): 소켓 생성 함수 소켓을 생성하고 사용할 프로토콜을 지정한다. SOCKET은 일종의 HANDLE값이며 포인터이다. socket discriptor라고 부르며 32bit정수값이다. bind(): src ip와 port 설정 Client는 서버와 달리 일반적으로 bind()를 호출하지 않는다. 그러면 OS가 자동으로 src ip와 port를 지정해준다. 다만 Client도 특별한 경우 src ip와 port를 지정하고 싶다면 bind()를 호출하면 된다. connect(): 서버로의 연결 시도.. 더보기 Basic model(Server) - Idea WSAStartup(): 윈속 초기화 함수 WSAStartup(): WS2_32.DLL을 메모리에 로드(초기화) 하는 함수. WSAClenup(): 윈속 함수 사용중지를 알리고 리소스를 반환하는 함수. socket(): 소켓 생성 함수 소켓을 생성하고 사용할 프로토콜을 지정한다. SOCKET은 일종의 HANDLE값이며 포인터이다. socket discriptor라고 부르며 32bit정수값이다. bind(): 소켓의 local IP주소와 local port를 지정한다. int bind(SOCKET s, const struct sockaddr *name, int namelen); 함수 사용. 두번째 인자는 SOCKADDR_IN 구조체에 값을 담아 SOCKADDR*형으로 캐스팅하여 전달한다. listen():.. 더보기 이전 1 다음