1. 동작 여부 및 실행 예1) 오류가 없는 경우① 먼저 파일이 저장될 클라이언트에 아래와 같은 ReceiveFile이란 폴더를 만들어야 합니다. 경로를 절대 경로로 설정하여 두어서 반드시 설정을 해두어야 합니다.② 서버에서 파일을 선택해서 전송을 하려는 단계입니다.③ 서버 측에서 파일(100메가 huge.zip)을 전송한 뒤의 화면입니다.(파일 스트림(I/O)버퍼와 랜으로의 파일전송 버퍼를 8Kbyte로 고정했을 때)④ 수신 완료시 클라이언트 측의 화면입니다.④ 서버 측에서 파일(10메가 test_10.zip)을 전송한 뒤의 화면입니다.(파일 스트림(I/O)버퍼와 랜으로의 파일전송 버퍼를 8Kbyte로 고정했을 때)④ 수신 완료시 클라이언트 측의 화면입니다2) 오류 발생 경우8KByte초과로(16KByte이상) 파일스트림(I/O) 버퍼와 랜으로의 파일 전송 버퍼를 두었을 때(Local 상과 네트워크 상에서 모두 동일합니다.) 이에 대한 분석은 뒤에서 다루겠습니다.2. 사용한 트랜스포트 계층 프로토콜 (TCP, UDP, 기타)제가 이 프로그램에서 사용한 프로토콜을 TCP/IP입니다. 그 중에서도 기본 구현 Tool이 비주얼 C++였기에 CAsyncSocket 클래스를 이용하였습니다. 따라서 non-Blocking 모드로 동작을 합니다. 아래의 그림을 참고로 하여 구현사항을 설명하겠습니다.기본적인 구현은 위 표와 동일합니다. 다만 bind()함수는 편의상 직접 IP주소와 Port번호를 입력하므로 실제 내부 함수 구현에서 생략되었습니다.1) 전체적인 이 프로그램의 파일전송은 흐름은 아래와 같습니다.① 서버와 클라이언트에서 각각 프로그램을 실행합니다. 각각 동일한 하나의 프로그램에서 라디오버튼으로 서버와 클라이언트를 선택할 수 있도록 구현했습니다. 그래서 각각 해당하는 라디오 버튼을 눌립니다.② 서버측이 먼저 ConnectOn버튼을 눌립니다. 다음 클라이언트 측이 ConnectOn버튼을 눌립니다. 그러면 상태창에 각각의 상태가 제대로 연결되었는지 표시가 나옵니다.③1kxx오류 발생파일 전송도에러 발생1k32kxx32k2kxx2k32xx32k4kxx4k32kxx32k8kxx8k32kxx32k16kxx16k32kxx32k32kxx2) 결과에 대한 분석입니다.실험 환경은 학교 피시실(펜티엄 4 1.7G, 메모리 256M, 하드 20G, 10/100이더넷 랜카드)에서 두 대의 컴퓨터를 이용하여 측정을 하였습니다. 주위에 사람들이 인터넷 같은 구내 랜선에 부하를 줄수 있는 프로그램을 사용하고 있을때보다는 그렇지 않을때가 훨씬더 속도가 빨랐습니다.측정에 사용한 파일은 홈페이지에 있는 huge.zip(100M) 파일과 correct.zip(10M)파일이었습니다. 물론 개인적으로 사용한 약 100M와 10M가 파일이 있었지만 측정 결과는 동일하여 생략했습니다.① 전체적으로 파일I/O 버퍼사이즈( )와 랜으로 파일전송시 TCP/IP 버퍼사이즈( )가 같을때 속도가 제일 빨랐습니다. 즉 파일 전송시 소요시간이 제일 짧았습니다. 아마도 메모리에서 파일을 읽어서 바로 랜으로 전송하는 것이 속도의 효율성면에서 월등히 좋아서 그런 듯 합니다.② 대체적으로 의 수치가 수치의 증가치보다 속도에 영향이 더 컸습니다. 즉 파일 I/O의 버퍼 사이즈가 일정 수준이상까지는 더 중요했습니다.③ 와 둘 다 같은 16Kbyte 이상의 버퍼를 가질 경우 전송시 에러가 발생했습니다. 이는 파일 I/O의 경우에 그 수치가 8Kbyte이상이 될 경우 한번의 로드가 아니라 두 번의 로드가 필요해서 그 시간의 딜레이로 인해 전송이 실패하는 경우가 발생한 것으로 보입니다. 또한 랜으로의 전송 역시 랜카드 자체의 버퍼사이즈와 TCP/IP전송시 이더넷 전송사이즈가 16Kbyte 이상의 경우 마찬가지로 딜레이로 인해 전송오류가 자주 발생했습니다. (한번이라도 전송오류가 발생했을 경우 도표에 'x'표시를 했습니다.)④ 버퍼의 사이즈가 8Kbyte까지 증가하는 경우, 처럼 메모리에 한꺼번에 로드해서 파일을 전송 하는 것보다 처럼 Pipe Line의 개념을 이용해서 전송하는 것이 훨alog's OnReceive function((CFileTransDlg*)m_pWnd)->OnReceive();}void CDerivedAsyncSocket::OnClose(int nErrorCode){if (nErrorCode == 0)// No, call the dialog's OnClose function((CFileTransDlg*)m_pWnd)->OnCClose();}void CDerivedAsyncSocket::OnSend(int nErrorCode){if (nErrorCode == 0)// No, call the dialog's OnSend function((CFileTransDlg*)m_pWnd)->OnSend();}// FileTransDlg.h : header file//#if !defined(AFX_FILETRANSDLG_H__090DF6CC_958A_4DA8_BDC4_732BF3E6999E__INCLUDED_)#define AFX_FILETRANSDLG_H__090DF6CC_958A_4DA8_BDC4_732BF3E6999E__INCLUDED_#include "DerivedAsyncSocket.h"#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include "time.h"#define PORT 5000#define IP "211.176.37.237"/////////////////////////////////////////////////////////////////////////////// CFileTransDlg dialogclass CFileTransDlg : public CDialog{// Constructionpublic:int m_SendCheck; // 보내기 모드인지..받기 모드인지..//1->보내기, 0->받기..time_t start_time, end_time;CFile *m_file; //파일포인터BOOL FileIsOpen; // 파일 오픈 여부..BOOL m_bCog(CFileTransDlg::IDD, pParent){//{{AFX_DATA_INIT(CFileTransDlg)m_strIP = _T("");m_nPort = 0;m_dFRSize = 0.0;m_dFSSize = 0.0;m_SendCheck=0;RRcount=SRcount=0;m_Status = _T("");//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);m_bConnected=FALSE;FileIsOpen = FALSE;}void CFileTransDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CFileTransDlg)DDX_Control(pDX, IDC_STATE, m_ctrlState);DDX_Control(pDX, IDC_GUBUN, m_ctrlStatic);DDX_Control(pDX, IDC_PROGRESS1, m_prCtrl);DDX_Control(pDX, IDC_EDIT_SEND, m_ctrlEditSendFile);DDX_Control(pDX, IDC_EDIT_RECEIVE, m_ctrlEditReceiveFile);DDX_Control(pDX, IDC_BUTTON_CONNECTON, m_ctrlButtonConnecton);DDX_Text(pDX, IDC_SERVERIP, m_strIP);DDX_Text(pDX, IDC_PORTNUM, m_nPort);DDX_Text(pDX, IDC_EDIT_FRSIZE, m_dFRSize);DDX_Text(pDX, IDC_EDIT_FSSIZE, m_dFSSize);DDX_Text(pDX, IDC_STATUS, m_Status);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CFileTransDwText("Waiting");m_Status = "Connect out from Server";}if(FileIsOpen){m_file->Close();delete m_file;m_file = NULL;FileIsOpen = FALSE;}Sleep(1000);UpdateData(FALSE);}void CFileTransDlg::OnReceive(){if(m_SendCheck==0) //받기 모드시{OnRReceive();}if(m_SendCheck==1) //보내기 모드시{OnSReceive();}}void CFileTransDlg::OnClient() //콤보 제어{m_bclient=1-m_bclient;UpdateData(TRUE);m_Status = m_strIP;UpdateData(FALSE);m_Status = "";m_bserver=FALSE;if(m_bclient){m_ctrlStatic.SetWindowText("Client");m_ctrlButtonConnecton.SetWindowText("Connect");}}void CFileTransDlg::OnServer() //콤보 제어{// TODO: Add your control notification handler code herem_bserver=1-m_bserver;UpdateData(TRUE);m_Status = m_strIP;UpdateData(FALSE);m_Status = "";m_bclient=FALSE;if(m_bserver){m_ctrlStatic.SetWindowText("Server");m_ctrlButtonConnecton.SetWindowText("Listen");}}void CFileTransDlg::OnButtonConnecton() //Connecton / Listen버튼 눌렀을 때{// TODO: Add your control notification handler code hereif(!m_bConnected){UpdateData(TRUE);m_Status = m;
지금도 그렇지만 어릴 때부터 만화 영화를 무척이나 좋아했습니다. 초등학교 때 주말 아침이나 공휴일, 특히 명절 때만 되면 나오는 만화영화를 보려고 기를 쓰고 달려들었습니다. 행여나 그 시간대를 놓칠까봐 혼자서 얼마나 시계를 보며 기다렸는지, 어머니가 그걸 보시고는 그 당시 흔치 않던 리모컨 달린 TV도 제 방에 두셨습니다. 극장에서 만화영화를 상영한다고 하면 바쁘다고 한사코 싫다하시던 부모님에게 한참을 매달려 함께 보러 가곤 했습니다. 그런데 학년이 올라가면서 알게 된 사실, 그건 제가 그렇게 좋아하던 만화영화의 거의 대부분이 일본 작품이고 또 대부분 그 아류작이란 사실을 알게 되었을 때 자연스레 만화 영화와는 거리가 생기게 되었습니다. 제 우상이던 마징가 Z가 일본 것이고, 은하철도 999의 그 멋진 영상들까지도 그러했습니다. 그때만 하더라도 어린 저에겐 아주 큰 상처였기 때문입니다. 더구나 몇 번씩이나 같은 만화영화를 재탕 삼탕 식으로 상영하다보니 이제는 다음 장면이 무엇이 나올지도 외울 정도가 되어버려 애니메이션에 식상해지기도 했습니다.
이 프로그램은 ALKANOID(벽돌 깨기)라는 게임입니다. 막대를 이용하여 공으로 상단의 벽돌을 깨뜨리는 격파 게임입니다. 총 3개의 스테이지로 구성이 되어 있으며, 각 스테이지에 있는 모든 벽돌을 다 깨야지만 다음 스테이지로 넘어갑니다. ⑴ 실행파일 : block.exe (컴파일하시면 나옵니다.) ⑵ 실행 시 반드시 실행파일과 함께 trumpet1.wav 파일과 done.wav 파일 및 good.mid 파일이 같이 있어야 합니다. (이 파일들은 배경음악 및 효과음 파일입니다.) ⑶ 시스템에 비주얼 C++이 설치되어 있어야 하며(제작 시 6.0에서 작업) 운영체제는 윈도우 2000 과 XP에서 원활히 실행됩니다. (단 98에서는 실행을 장담할 수 없습니다.)
1. 프로그램 개요 및 설명 : 이 프로그램은 푸쉬푸쉬란 게임이다. 푸쉬맨(새알)이 주어진 말(편지)을 집(우체통)에 모두 다 넣으면 되는 게임이다. (삼성 휴대폰에 있는 게임과 동일하다.)♣ 단 이 프로그램을 실행 시 실행파일과 음악 파일들이 같은 디렉토리에 있어야 한다. 아래는 음악 파일 리스트이다. 시디에는 실행파일과 같은 루트 디렉토리에 들어있다.2. 설명서 : 1-5번까지 내용은 그대로 구현이 되었다.6번 : 주어진 스펙대로 푸쉬맨(새알)이 움직인 횟수를 표시 하였다.7번 : Back 기능은 툴바의 버튼을 눌리면 실행된다. 단 1회만 가능하다.8번 : 총 3개의 게임으로 구성되어 있다. 현재 게임을 clear할 경우 다음 단계로 넘어가게 되어있다.9번 : 추가한 사항은 아래와 같다. ① 배경과 각각의 아이콘들을 직접 그렸다. 푸쉬맨->새알, 말->편지, 집->우체통으로 모두 바뀌었고 벽도 꽃무늬로 바뀌었다. 편지가 우체통에 들어갈 때와 푸쉬맨이 우체통에 들어갈 때도 그림이 다르다. ② 배경음악과 효과음들이 추가되었다. 푸쉬맨이 움직이거나 집 속으로 말이 들어갈 때, 이동하지 못하는 경우(에를 들면, 벽 쪽으로 계속 이동하려고 할 때)에 각각의 효과음을 나타낸다. 또한 각 스테이지를 clear 할 경우와 전체 스테이지를 lear 했을 때, Undo 버튼을 사용했을 때도 효과음이 난다.