언제나휴일 50

[C#] 원격 제어 프로그램 13. 원격 제어 이벤트 수신 서버

1. 유튜브 동영상 강의 원격 제어 프로그램 - 원격 제어 이벤트 수신 서버 2. 원격 제어 이벤트 수신 서버 원격 제어 컨트롤러에서 제어하기 위해 키보드와 마우스 이벤트를 원격 제어 호스트에서 전송합니다. 이를 위해 원격 제어 호스트에서는 이러한 키보드, 마우스 이벤트를 수신하기 위한 서버가 필요합니다. 이제 원격 제어 이벤트 수신 서버를 표현할 RecvEventServer 클래스를 정의합시다. public class RecvEventServer { 서버의 Listen 소켓을 멤버로 선언합니다. Socket lis_sock; 메시지를 수신하였을 때 처리를 위해 이벤트를 멤버로 선언합니다. public event RecvKMEEventHandler RecvedKMEvent = null; 클라이언트의 연결..

[C#] 원격 제어 프로그램 14. 원격 제어 컨트롤러

1. 유튜브 동영상 강의 원격 제어 프로그램 - 원격 제어 컨트롤러 2. 원격 제어 컨트롤러 이제 원격 제어 컨트롤러를 만들어 봅시다. 먼저 공통으로 사용할 부분을 작성할게요. public static class NetworkInfo { 이미지 서버 포트 접근자를 제공합시다. 여기에서 하드 코딩할게요. public static short ImgPort //이미지 서버 포트 { get { return 20004; } } 원격 제어 요청 포트 접근자를 제공합시다. public static short SetupPort//원격 제어 요청 포트 { get { return 20002; } } 이벤트 서버 포트 접근자를 제공합시다. public static short EventPort//이벤트 서버 포트 { get ..

[C#] 원격 제어 프로그램 15. 키보드, 마우스 이벤트 래퍼

1. 유튜브 동영상 강의 원격 제어 프로그램 - 키보드, 마우스 이벤트 래퍼 2. 키보드, 마우스 이벤트 래퍼 원격 제어 호스트에서는 수신한 키보드와 마우스 이벤트를 프로그램 방식으로 발생해 주어야 합니다. 이를 위해 Windows API에서 제공하는 기능을 래핑하여 클래스로 구현합시다. 키보드 이벤트나 마우스 이벤트를 강제로 발생하기 위해서는 Windows API에서 제공하는 시스템 함수를 호출해야 합니다. 다음은 프로그램 방식으로 키보드 이벤트를 발생시키는 keybd_event 함수의 원형입니다. WINUSERAPI VOID WINAPI keybd_event( __in BYTE bVk, __in BYTE bScan,__in DWORD dwFlags,__in ULONG_PTR dwExtraInfo); ..

[C#] 원격 제어 프로그램 16. 원격 제어 호스트

1. 유튜브 동영상 강의 원격 제어 프로그램 - 원격 제어 호스트 2. 원격 제어 호스트 이제 원격 제어 호스트를 표현할 Remote 클래스를 구현해 봅시다. public class Remote { 원격 제어 호스트 개체도 프로그램에 유일해야 하므로 단일체 패턴을 적용할게요. 먼저 클래스 내에 정적 멤버 필드로 단일 개체를 선언하세요. static Remote singleton;//단일 개체 다른 형식에서 단일 개체를 가져오기 할 수 있게 속성을 제공하세요. public static Remote Singleton { get { return singleton; } } 단일 개체는 정적 생성자에서 생성하세요. static Remote() { singleton = new Remote(); //단일 개체 생성 ..

[C#] 원격 제어 프로그램 17. 가상 커서

1. 유튜브 동영상 강의 원격 제어 프로그램 - 가상 커서 원격 제어 컨트롤러에서는 상대 호스트의 마우스 위치를 화면에 표시해야 합니다. 이 부분을 위해 가상의 커서를 만듭시다. 가상 커서는 도구 스타일의 작은 폼으로 정의합시다. VirtualCursorForm 이름의 폼을 추가하세요. Form의 AutoSizeMode를 GrowAndShrink로 설정하세요. BackColor는 Red, FormBorderSytle은 None, TopMost를 True로 지정합니다. Size 속성과 MaximumSize, MinimumSize 속성을 10, 10으로 지정하세요. 폼의 Load 이벤트 핸들러를 등록하세요. 폼이나 컨트롤의 이벤트 핸들러를 등록할 때는 속성 창을 이용하여 등록하세요. Load 이벤트 핸들러에..

[C#] 원격 제어 프로그램 18. 원격 클라이언트 폼

1. 유튜브 동영상 강의 원격 제어 프로그램 - 원격 클라이언트 폼 2. 원격 클라이언트 폼 이번에는 원격 제어할 때 대상 호스트의 화면을 표시하는 RemoteCleintForm 폼을 추가하세요. 자식 컨트롤로 PictureBox 컨트롤을 추가하고 이름을 pbox_remote으로 정합시다. PictureBox 컨트롤의 Dock 속성을 Fill로 설정하고 SizeMode 속성르 StretchImage로 설정하세요. 멤버 필드로 이미지를 수신하였는지 확인하는 멤버와 이미지 크기를 기억할 멤버를 선언하세요. bool check;//이미지 수신 여부 Size csize; //클라이언트 폼 크기 원격 호스트를 제어하기 위한 키보드와 마우스 이벤트를 전송에 사용할 클라이언트를 속성으로 제공합시다. SendEvent..

[C#] 원격 제어 프로그램 19. MainForm

1. 유튜브 동영상 강의 원격 제어 프로그램 - 마지막 강의 2. MainForm 가상 커서와 원격 제어 화면과 상대 IP와 포트를 멤버를 선언합니다. string sip; //상대 IP int sport; //상대 port RemoteCleintForm rcf = null;//원격 호스트 화면(제어 화면) VirtualCursorForm vcf = null;//가상 커서 속성 창을 이용해서 Load 이벤트 핸들러를 등록하세요. private void MainForm_Load(object sender, EventArgs e) { 가상 커서 폼과 원격 제어 호스트 화면을 표시할 폼을 생성합니다. vcf = new VirtualCursorForm(); //가상 커서 생성 rcf = new RemoteClei..

[C#] 원격 제어 프로그램 - 보너스 트랙 1. 화면 캡쳐/이미지 송수신

1.유튜브 동영상 강의 [C#] 화면 캡쳐/이미지 송수신 2. 화면 캡쳐/이미지 송수신 안녕하세요. 언제나 휴일에 언휴예요. 이번 강의는 화면 캡쳐와 이미지를 전송하는 클라이언트 및 이미지를 수신하는 서버를 만들어 볼게요. 원격 제어 프로그램을 만들다가 갑자기 엉뚱한 걸 만든다고 생각하시나요? 7~9강까지 다룬 내용은 ImageClient, RecvImageEventArgs, ImageServer입니다. 이들은 이미지를 전송하고 수신하는 서버를 만들 때 사용할 수 있어요. 이번 강의는 이들을 라이브러리 형태로 만들고 이를 이용하는 프로그램을 만들 거예요. 어떻게 보면 부분적인 테스트를 하는 것이라 볼 수도 있겠죠. 2.1 이미지 송수신 라이브러리 만들기 7~9강까지 만든 파일로 라이브러리를 만들어요. 먼..

[C#] 원격 제어 프로그램 - 보너스 트랙 2. 오토 키보드 구현

1. 유튜브 동영상 강의 오토 키보드 구현 C#에서 Win32 API 사용 2. 오토 키보드 구현 안녕하세요. 언제나 휴일에 언휴예요. 현재 원격제어 프로그램 프로젝트에서 이미지를 송수신하는 부분까지 구현하였습니다. 이제 프로그램 방식으로 키보드와 이벤트를 발생시켜 제어하는 부분으로 넘어갈 단계입니다. 키보드와 마우스 이벤트 발생하면 이 정보를 전송하는 부분과 이를 수신하는 부분을 구현해야겠죠.. 그리고 수신한 곳에서는 프로그램 방식으로 키보드와 마우스 이벤트를 발생시켜야 합니다. 흔히 오토 마우스, 오토 키보드라고 말하는 프로그램에 사용하는 기술이죠. 그런데 키보드와 마우스 이벤트를 발생하는 것은 Win32 API에서 제공하고 있어요. 이를 이용하기 위해 마이그레이션을 할 거예요. 이 부분을 미리 학습..

[C#] 원격 제어 프로그램 - 보너스 트랙 3. 키보드 마우스 이벤트 송수신

1. 유튜브 동영상 강의 원격 제어 프로그램 - 키보드 마우스 이벤트 송수신 2. 키보드 마우스 이벤트 송수신 원격제어 프로그램 만들기에서 키보드와 마우스 이벤트 전송에 관해 구현한 것을 라이브러리로 만드는 실습을 합니다. 이를 참조하여 키보드와 마우스 이벤트를 전송하는 클라이언트 응용을 만듭니다. 또한 이를 수신하는 서버 응용을 만듭니다. 이를 통해 키보드와 마우스 이벤트 관련 라이브러리 제작에 문제가 있는지 테스트합니다. 원격 제어 프로그램 만들기 과정에서 중간에 테스트를 하기 위한 부분입니다. 동영상 강의를 참고하세요.

스택 - 버퍼 동적 할당

1. 스택 이번에 작성할 코드는 버퍼를 동적으로 할당받는 스택(STACK)입니다. 스택은 자료를 한쪽으로 보관하고 꺼내는 LIFO(Last In First Out) 방식의 자료구조입니다. 스택에 자료를 보관하는 연산을 PUSH라 말하고 꺼내는 연산을 POP이라고 말합니다. 그리고 가장 최근에 보관한 위치 정보를 TOP 혹은 스택 포인터라 말합니다. 2. 알고리즘 Push 연산 IF Top> MAX Then (꽉차면) Overflow (버퍼오버플로우) Else (꽉차지않을때) Top = Top +1 (Top 위치를 1 증가) Buffer[Top] = data (버퍼의 Top 위치에 data 보관) Pop 연산 IF Top=-1 Then (비었으면) Underflow (버퍼언더플로우) Else data = ..

P2P 메신저 - 파일 수신 서버 구현 [C#]

1. 유튜브 동영상 강의 이번 강의는 파일 수신 서버 구현 실습이예요. 이전 글(P2P 메신저 - 파일 전송 클라이언트 구현 [C#]) 이 필요하겠네요. 2. 이벤트 인자 및 대리자 소스 코드 2.1 연결 요청 수락 이벤트 인자 및 대리자 using System; using System.Net; namespace 파일_수신_서버 { public delegate void AcceptedEventHandler(object sender, AcceptedEventArgs e); public class AcceptedEventArgs:EventArgs { public IPEndPoint RemoteEndPoint { get; private set; } public string IPStr { get { return..

P2P 메신저 – 숏 메시지 송수신 예광탄 구현하기 [C#]

1. 유튜브 동영상 강의 안녕하세요. 언제나 휴일에 언휴예요. 이번 강의는 P2P 메신저 중에서 숏 메시지 송수신 부분을 구현할 거예요. P2P 프로그램은 Peer와 Peer 사이의 통신을 하는 프로그램을 말하죠. 전통적인 네트워크 프로그래밍에서 사용자가 사용하는 응용을 클라이언트, 서비스 제공하는 응용을 서버라고 부르죠. 그런데 P2P 프로그램에서 사용자가 사용하는 Peer는 특정 네트워크 서비스를 서버를 거치지 않고 Peer끼리 직접 주고 받습니다. 이를 위해 특정 서비스의 서버 부분과 클라이언트 부분이 Peer 부분에 구현합니다. 이번 강의는 이러한 특징을 갖는 P2P 프로그램 중에 Short 메시지를 주고 받는 부분을 구현합니다. 2. 화면 배치 숏 메시지 송수신 예광탄 프로그램에서는 자신의 IP..

스택 - 버퍼 크기 고정

1. 스택 스택은 자료를 한쪽으로 보관하고 꺼내는 LIFO(Last In First Out) 방식의 자료구조입니다. 스택에 자료를 보관하는 연산을 PUSH라 말하고 꺼내는 연산을 POP이라고 말합니다. 그리고 가장 최근에 보관한 위치 정보를 TOP 혹은 스택 포인터라 말합니다. 2. 알고리즘 Push 연산 IF Top> MAX Then (꽉 차면) Overflow (버퍼 오버플로우) Else (꽉 차지 않을 때) Top = Top +1 (Top 위치를 1 증가) Buffer[Top] = data (버퍼의 Top 위치에 data 보관) Pop 연산 IF Top=-1 Then (비었으면) Underflow (버퍼 언더플로우) Else data = Buffer[Top] (버퍼의 Top 위치의 값을 데이터에 설..

[C#] 테트리스 만들기 – Part 4(Final). 꽉 찬 줄 지우기, Ending

프로젝트 다운로드 프로젝트 다운로드 -벽돌 모양에 따라 색상 변경 기능 추가 1. 유튜브 동영상 강의 안녕하세요. 언제나 휴일에 언휴예요. 이번 강의는 테트리스 프로젝트의 마지막 부분입니다. 이번 강의에서는 꽉 찬 라인을 지우는 기능과 종료 조건을 체크하는 부분을 구현합니다. 2. Board 형식 수정 Store 메서드에 라인이 꽉 찼는지 확인하는 메서드를 호출합니다. 이 때 주의할 점은 라인 체크는 아래부터 한다는 것입니다. 벽돌이 4X4공간에 배치하므로 벽돌이 있는 좌표에서 3칸 더 있다는 것을 고려하세요. internal void Store(int bn, int turn, int x, int y) { for (int xx = 0; xx < 4; xx++) { for(int yy = 0; yy=0)&..

[C#] 테트리스 만들기 – Part 3. 벽돌 쌓기

프로젝트 다운로드 1. 유튜브 동영상 강의 안녕하세요. 언휴예요. 이번 강의는 “테트리스 프로젝트 Part 3. 벽돌 쌓기” 입니다. 2. Board 형식 정의 벽돌을 쌓기 위해서는 Board의 상태를 기억할 형식이 필요합니다. 하나의 개체만 필요해서 단일체로 표현할게요. class Board { internal static Board GameBoard { get; private set; } static Board() { GameBoard = new Board(); } Board() { } } 벽돌을 쌓기 위한 배열 멤버 필드를 선언하고 배열 개체를 생성하세요. int[,] board = new int[GameRule.BX, GameRule.BY]; 보드의 특정 영역이 어떤 값인지 확인할 수 있게 속성을..

[C#] 테트리스 만들기 – Part 2. 테트리스 도형 정의하기, 도형 회전하기

프로젝트 다운로드 1. 유튜브 동영상 강의 안녕하세요. 언휴예요. 이번 강의는 “[언제나 프로젝트] 테트리스 Part2″입니다. 현재 작업한 내용은 다음과 같습니다. 게임 공간 정의 키보드로 도형 이동(좌, 우, 아래) 타이머로 도형 내리기 이번 강의에서 다룰 내용은 다음과 같습니다. 테트리스 도형 모양 정의 회전 2. 테트리스 도형 모양 정의 테트리스 벽돌은 모두 7가지 입니다. 테트리스 벽돌은 90도로 회전하여 4가지 형태로 모양이 변할 수 있습니다. 테트리스 벽돌은 4X4 공간에 총 4개의 돌이 공간을 차지합니다. 테트리스 벽돌 모양은 모두 7가지 종류로 변하는 값이 아닙니다. 이를 읽기 전용으로 정의할 거예요. 그리고 벽돌 모양 정의는 별도의 형식에서 정의할게요. 이는 개체를 만들기 위함이 아니라..

병합 정렬(합병 정렬, Merge Sort) 알고리즘

1. 유튜브 동영상 강의 병합 정렬 알고리즘 동영상 강의 2. 알고리즘 이번에는 병합 정렬 알고리즘을 살펴봅시다. 병합 정렬 알고리즘은 배열을 작은 단위의 배열로 분할한 후에 분할한 배열을 정렬하고 이들을 다시 정렬하면서 전체 배열을 정렬하는 알고리즘입니다. 병합 정렬(base:배열의 시작 주소, n: 원소 개수, compare:비교 논리) ah:= n/2 bh:= n – ah; 조건(n이 1보다 작거나 같으면) 종료 병합정렬(base,ah,compare) 병합접열(base+ah,bh,compare) tbase에 동적 메모리 할당(원소크기*원소개수) 메모리 복사(tbase,base) ai:=0 bi:=ah i:=0 반복(ai가 ah보다 작으면서 bi가 n보다 작다) 조건(tbase[ai]가 tbase[b..

퀵 정렬 (Quick Sort)

1. 유튜브 동영상 강의 퀵정렬 유튜브 동영상 강의 2. 퀵정렬 알고리즘 퀵 정렬 알고리즘은 피벗 값을 선택하여 피벗 값보다 작은 값들은 왼쪽으로 보내고 큰 값들은 오른쪽으로 보낸 후에 이들 사이에 피벗을 위치시키는 원리를 이용합니다. 이후 피벗보다 작은 값들을 재귀 호출로 정렬하고 피벗보다 큰 값들도 재귀 호출로 정렬하는 방식입니다. 그런데 퀵 정렬은 어떠한 요소를 피벗으로 선택하냐에 따라 성능에 차이가 납니다. 만약 전체 요소의 중간 순위의 요소를 선택하면 재귀 호출에서 반씩 나누어 정렬을 하게 되어 좋은 성능을 발휘합니다. 하지만 가장 작은 값이나 가장 큰 값을 피벗으로 선택하면 최악의 성능을 발휘합니다. 여기에서는 맨 앞과 맨 뒤, 그리고 중간 위치의 요소를 비교하에 세 값 중에 중간 값을 피벗으..

테트리스 처음부터 끝까지 [C++, Windows API]

1. 유튜브 동영상 강의 2. 소스 코드 안녕하세요. 언제나휴일입니다. 동영상 강의를 제작하면서 만든 코드입니다. 불필요한 코드가 남아있지만 그대로 올립니다. 2.1 Program.cpp #include #include "Document.h" #define BOARD_SX70 #define BOARD_SY50 #define MY_WIDTH15 #define MY_HEIGHT15 #define MY_RX(x)(BOARD_SX+(x)*MY_WIDTH) #define MY_RY(y)(BOARD_SY+(y)*MY_HEIGHT) #define NEXT_SX270 #define MY_NRX(x)(NEXT_SX+(x)*MY_WIDTH) #define MY_NRY(y)(MY_RY(y)) #define DIAGRAM_W..