본문 바로가기

windows

C로짠 Client Windows Socket 소스 C로짠 Client Windows Socket 소스입니다. #include #include #include #pragma comment(lib, "ws2_32.lib") #define IP "127.0.0.1" #define PORT 80 int main() { WSADATA wsaData; SOCKET client; SOCKADDR_IN serveraddr; char buf[1024]; WSAStartup(0x0202, &wsaData); printf("WSAStartup : %d\n", WSAGetLastError()); client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); printf("socket : %d\n", WSAGetLastError()); serve.. 더보기
쓰레드(Thread) 메모리 접근 동기화 1. 크리티컬 섹션 기반의 동기화(유저 모드) : 개념 : 열쇠(Critical Section)를 생성한다. 쓰레드가 임계 영역에 접근하기 위해서는 열쇠를 얻어야 한다. 열쇠를 얻어 임계 영역에 접근한 쓰레드는 일을 마친후 다음 쓰레드를 위해 열쇠를 반환한다. 사용법 : CRITICAL_SECTION gCriticalSection; // 열쇠를 생성한다 // 크리티컬 섹션 오브젝트 선언후에는 반드시 초기화 해야한다. void InitializeCriticalSection( // 크리티컬 섹션 오브젝트 초기화 함수 LPCRITICAL_SECTION lpCriticalSection // 초기화 하려는 크리티컬 섹션 오브젝트의 주소값 ); void EnterCriticalSection( LPCRITICAL_S.. 더보기
쓰레드(Thread) 쓰레드(Thread) : 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델 1. 독립적인 스택(Stack)을 가진다. 2. 코드 영역을 공유한다. (위와 같이 쓰레드 main 함수는 코드 영역에 존재하는 모든 함수를 호출할 수 있다) 3. 데이터 영역과 힙을 공유한다.(전역변수와 동적 할당된 메모리 공간 공유 가능) 4. 프로세스 핸들 테이블 공유 프로세스 핸들 테이블에 대한 핸들 정보는 프로세스 내의 쓰레드 들에게 공유되어 각 쓰레드가 그 핸들에 대해 접근이 가능하다 (참고 : 같은 프로세스내의 쓰레드들은 스택 이외의 모든 것을 공유한다) 프로세스와 쓰레드 Windows 에서 프로세스는 단순히 쓰레드를 담는 상자다. 실제 프로그램 흐름을 형성하는 것은 쓰레드이다. 따라서 스케줄러(Windo.. 더보기
커널 오브젝트(Kernel Object) 커널 오브젝트 : Windows 운영체제에서 리소스(Resource : 프로세스, 쓰레드, 파일)들을 관리하기 위한 데이터를 저장하는 메모리 블록 Windows에서 관리하는 리소스 특성을 변경하기 위해서는 해당 리소스의 커널 오브젝트를 조작해야한다. 해당 리소스의 정보를 저장하고 있는 커널 오브젝트에 접근하기 위해서는 커널 오브젝트들을 구별하는 커널 오브젝트 핸들(Object Handle)을 얻어야 한다. 커널 오브젝트와 핸들 : 커널 오브젝트는 Windows 운영체제에 종속적이다. 사용자가 리소스 생성을 요청하면 운영체제에서 사용자가 요청한 대로 리소스를 생성하게 되고 이를 관리하기 위해 커널 오브젝트를 생성한다. 즉, 커널 오브젝트는 Windows 운영체제에 의해 생성 및 소멸이 결정된다. 리소스가 .. 더보기
윈도우 관리 메시지 입력 처리의 중심에는 메시지가 있다. 이런 명시적인 입력 외에 윈도우에 관한 기본적인 관리도 메시지로 한다. 윈도우의 상황 변화시에 보내지는 메시지들도 응용 프로그램의 입장에서 보면 일종의 입력이며 프로그램은 이를 적절하게 처리해야 한다. 1. 생성 및 파괴 : 윈도우와 관련된 메시지중 가장 간단한 메시지는 윈도우가 생성될 때 보내지는 WM_CREATE 와 파괴될 때 보내지는 WM_DESTROY 두 가지가 있다. WM_CREATE 는 윈도우가 생성될 때 보내지므로 각종 초기화를 하기에 적합하며 WM_DESTROY 는 종료처리를 하기에 적합하다. 이 메시지들 대신해 사용할 수 있는 방법은 WinMain 에서 직접 초기화와 종료처리를 하는 것이다. WM_CREATE 메시지는 CreateWindow 함수에 의.. 더보기
포트포워딩(Port Forwarding) 개념 : 포트 포워딩이란 특정 포트(Port)를 개방해주어 통신이 가능하게 해주는것입니다. 애초에 모든 포트를 개방했다면 포트 포워딩이 필요하지 않겠죠. 하지만 이럴 경우 보안상의 많은 위협에 노출이 될 수 있습니다. 따라서 대부분 방화벽을 사용합니다. 허용된 포트만 개방하여 통신하는 것이죠. 어떤 에플리케이션을 사용할 시에 그 에플리케이션에서 사용하는 포트를 개방해야 합니다. (에플리케이션 설치시에 자동으로 사용할 포트를 열기도 합니다) 설정 : 1. 공유기를 사용하지 않을 경우 : 이 경우에는 윈도우 방화벽에서만 설정해주면 OK 입니다. 'Windows 방화벽 -> 예외 -> 프로그램 추가' 에서 해당 프로그램을 클릭하시면 그 프로그램이 사용하는 포트를 개방하게 됩니다. (간혹 이렇게 해서 안되는 경.. 더보기
윈도우 기초 프로그래밍 #include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HINSTANCE g_hInst; LPCTSTR lpszClass=TEXT("Sample"); int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance ,LPSTR lpszCmdParam,int nCmdShow) { HWND hWnd; MSG Message; WNDCLASS WndClass; g_hInst=hInstance; WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); WndClass.hCursor.. 더보기
윈도우즈(Windows) 프로그래밍의 기초 윈도우즈(Windows)의 장점 : 1. 그래픽 기반의 운영체제이다. 2. 멀티 태스킹이 가능하다. 3. 장치에 영향을 받지 않는다. 4. 일관성 개발툴의 선택 : 1. API : API(Application Programming Interface) : 운영체제가 응용 프로그램을 위해 제공하는 함수의 집합 2. SDK : SDK(Software Development Kit) : 윈도우즈를 만든 Microsoft에서 제공하는 윈도우즈용 프로그램 개발 킷이다. API 함수들을 사용하여 프로그램을 작성하며 가장 원론적이고 먼저 발표된 개발방법이다. 섬세하고 막강하며 속도가 빠르고 크기에 유리하나 방대한 API 함수를 알아야 하며 코드가 길어지고 생산성도 낮다. 3. 클래스 라이브러리 API 함수들을 좀 더 쉽.. 더보기
Windows PE 구조 PE 포맷이란 윈도우 OS가 파일을 실행시키기 위해서 Portable Executable 포맷 (확장자 : .exe와 .dll)을 동적 라이브러리를 링킹하기 위한 참조 값과 API export and import tables, 리소스 데이터와 TLS 데이터를 캡슐화한 것이다. 소스 코드를 컴파일하고 링크를 하여 PE 구조의 실행 파일이 생성되는 과정을 순서도로 보면 실행 파일에는 어떤 내용들이 들어있는지 윈도우 Notepad.exe를 메모장으로 열어보겠다. MZ는 PE를 만든 Mark Zbikowski의 이니셜로써, MS-DOS 헤더의 시작을 알리는 문자이다. "This program cannot be run in DOS mod" 문자열은 DOS 에서 윈도우 프로그램이 실행되면 출력하는 문자열이다. PE.. 더보기