Microsoft PowerPoint - 09-CE-24-채팅 프로그램

Similar documents
Microsoft PowerPoint - 09-CE-25-오목게임

Microsoft PowerPoint - 09-CE-23-윈도우 소켓

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

Microsoft PowerPoint - 09-CE-14-리스트콤보박스

2009년 상반기 사업계획

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

Microsoft PowerPoint - 09-EDU-15-채팅 프로그래밍

Microsoft PowerPoint - 12 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 1.ppt

제1장 Unix란 무엇인가?

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

04장 메시지 처리 유형

PowerPoint 프레젠테이션

Microsoft PowerPoint - CSharp-15-채팅

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

Microsoft PowerPoint PythonGUI-socket

본 강의에 들어가기 전

슬라이드 1

제1장 Unix란 무엇인가?

Microsoft PowerPoint - 03-TCP Programming.ppt

vi 사용법

본 강의에 들어가기 전

hd132x_k_v1r3_Final_.PDF

The Pocket Guide to TCP/IP Sockets: C Version

K&R2 Reference Manual 번역본

9장 윈도우 소켓 프로그래밍

Microsoft PowerPoint - Supplement-02-Socket Overview.ppt [호환 모드]

Microsoft PowerPoint - 09-CE-7-선과 도형

<4D F736F F F696E74202D20B3D7C6AEBFF6C5A9C7C1B7CEB1D7B7A1B9D65F FBCD2C4CF5FC3A4C6C35FBFA1C4DA2E BC8A3C8A

2014 년정보보호졸업작품보고서 파일유출방지시스템 지도교수님 : 양환석교수님 팀명 : LKC Security 팀원 : 이호영, 김상우, 최유택 중부대학교정보보호학과

1장 윈도우 프로그래밍 들어가기

<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 13 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 2.ppt

Microsoft PowerPoint - 06-CompSys-16-Socket.ppt

목차 목차포트스캔코드포트스캔결과포트스캔탐지코드포트스캔탐지결과 참조

PowerPoint 프레젠테이션

MFC 프로그래밍

윈도우즈 프로그래밍

슬라이드 1

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

예제와 함께 배워보는 OllyDbg사용법

03장.스택.key

[제1강] 텍스트를 입력하세요

Microsoft PowerPoint PythonGUI-network

Microsoft PowerPoint - 15-EmbedSW-10-Socket

Microsoft Word - src.doc

PowerPoint 프레젠테이션

슬라이드 1

C프로-3장c03逞풚

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770>

윈도우 프로그래밍

문서개정이력 개정번호개정사유및내용개정일자 1.0 최초작성 본문서는원문작성자 (Peter Van Eeckhoutte) 의허가하에번역및배포하는문서로, 원문과관련된모든내용의저작권은 Corelan에있으며, 추가된내용에대해서는 ( 주 ) 한국정보보호교육센터에

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint C-구조체

슬라이드 1

Chapter 1. MFC 시작하기

Chapter 4 UDP 소켓 사용법

Microsoft PowerPoint - CSharp-10-예외처리

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft Word - KPMC-400,401 SW 사용 설명서

PowerPoint 프레젠테이션

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

UI TASK & KEY EVENT

목 차 1. 포트스캐닝 (Port Scanning) 이란? 2. 포트 (Port) 란? 3. 스캔 (Scan) 의종류 4. 포트스캐너 (Port Scanner) 구현 5. 포트스캔 (Port Scan) 구현 6. 참조

슬라이드 1

4S 1차년도 평가 발표자료

<4D F736F F D2034C0E52D554E495820BCD2C4CF20C0C0BFEB20C7C1B7CEB1D7B7A1B9D6>

Microsoft Word - Network Programming_NewVersion_01_.docx

bn2019_2

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

윈도우 프로그래밍의 개념

<4D F736F F F696E74202D20C1A63235C0E520B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>


PowerPoint 프레젠테이션


자바-11장N'1-502

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

chap 5: Trees

SYN flooding

PowerPoint 프레젠테이션

본 강의에 들어가기 전

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

<33372DC0A9B5B5BFECC7C1B7CEB1D7B7A1B9D62E687770>

Chapter #01 Subject

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 4 가지중하나. (1) 프로그램수행직후, (2) kill 명령실행직후, (3) 15 #include <signal.

UI TASK & KEY EVENT

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor

게시판 스팸 실시간 차단 시스템

윈도우즈 프로그래밍

Microsoft PowerPoint - hci2-lecture1.ppt

BMP 파일 처리

Lab 3. 실습문제 (Single linked list)_해답.hwp

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Transcription:

순천향대학교컴퓨터학부이상정 1 학습내용 사용자인터페이스 프로그램구성 TCP 연결설정프로그램 서버연결설정 클라이언트연결설정 TCP 데이터송수신 순천향대학교컴퓨터학부이상정 2

사용자인터페이스 순천향대학교컴퓨터학부이상정 3 1:1 채팅프로그램 한프로그램이동시에서버와클라이언트로동작 프로그램시작시서버로동작 서버소켓생성하고상대방접속요청대기 채팅을위한연결요청시클라이언트로동작 다른쪽은상대방이열어놓은서버소켓에접속 순천향대학교정보기술공학부이상정 IP 네트워크 4

순천향대학교컴퓨터학부이상정 5 사용자인터페이스 4 개의에디트컨트롤과 2 개의버튼컨트롤 IP 주소와포트번호입력에디트컨트롤 ID_IP, ID_PORT 채팅입력에디트컨트롤 ID_INPUT 채팅내용표시에디트컨트롤 ID_MSG ES_MULTILINE, ES_READONLY, ES_AUTOHSCROLL, ES_AUTOVSCROLL 연결버튼컨트롤 ID_CONNECT 연결상태를캡션으로표시 Connect", Connecting... 메시지송신버튼컨트롤 ID_SEND 순천향대학교컴퓨터학부이상정 6

/// 채팅프로그램상수, 함수및변수선언 #define ID_IP 500 #define ID_PORT 501 #define ID_INPUT 502 #define ID_INFO 503 #define ID_CONNECT 504 #define ID_SEND 505 예제 48: 사용자인터페이스코드 (1) void create_gui(hwnd hwnd); // 에디트컨트롤, 버튼생성 HWND hip, hport, hinfo, hinput, hconnect, hsend; // 컨트롤핸들 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) case WM_CREATE: /// GUI 컨트롤생성 create_gui(hwnd); case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // 에디트제목텍스트출력 ExtTextOut(hdc, 10, 25, 0, NULL, L"IP Address", wcslen(l"ip Address"), NULL); ExtTextOut(hdc, 150, 25, 0, NULL, L"Port" Port, wcslen(l"port") ), NULL); EndPaint(hWnd, &ps); break; 순천향대학교컴퓨터학부이상정 7 예제 48: 사용자인터페이스코드 (2) /// 에디트컨트롤, 버튼생성 void create_gui(hwnd hwnd) // 에디트컨트롤생성 hip = CreateWindow(L"edit", NULL, WS_CHILD WS_BORDER WS_VISIBLE, 10, 40, 120, 20, hwnd, (HMENU)ID_IP, g_hinst, NULL); hport = CreateWindow(L"edit", NULL, WS_CHILD WS_BORDER WS_VISIBLE, 150, 40, 50, 20, hwnd, (HMENU)ID_PORT, g_hinst, NULL); hinput = CreateWindow(L"edit", NULL, WS_CHILD WS_BORDER WS_VISIBLE, 10, 90, 150, 20, hwnd, (HMENU)ID_INPUT, g_hinst, NULL); hinfo = CreateWindow(L"edit", NULL, WS_CHILD WS_BORDER WS_VISIBLE WS_VSCROLL WS_HSCROLL ES_MULTILINE ES_READONLY ES_AUTOHSCROLL ES_AUTOVSCROLL, 10, 120, 210, 140, hwnd, (HMENU)ID_INFO, g_hinst, NULL); // 버튼생성 hconnect = CreateWindow(L"button", L"Connect", WS_CHILD WS_VISIBLE BS_PUSHBUTTON, 10, 65, 120, 20, hwnd, (HMENU)ID_CONNECT, g_hinst, NULL); hsend = CreateWindow(L"button", L"Send", WS_CHILD WS_VISIBLE BS_PUSHBUTTON, 170, 90, 50, 20, hwnd, (HMENU)ID_SEND, g_hinst, NULL); 순천향대학교컴퓨터학부이상정 8

프로그램구성 순천향대학교컴퓨터학부이상정 9 프로그램구성도 순천향대학교컴퓨터학부이상정 10

주요함수 사용자인터페이스 void create_gui(hwnd hwnd); // 에디트컨트롤, 버튼생성 void ConnectClick(); // Connect 버튼클릭함수 void SendClick(); // Send 버튼클릭함수 연결설정 bool initwinsock(); // 윈속초기화 DWORD WINAPI ServerStart(LPVOID pdata); // 채팅서버시작쓰레드함수 void ServerStop(); // 채팅서버중지함수 bool Connect(); // 서버에연결요청함수 void Disconnect(); // 클라이언트연결중지함수 데이터송수신함수 DWORD WINAPI Receive(LPVOID pdata); // 메시지수신쓰레드함수 CHAR *ReceiveData(); // 데이터수신함수 void Send(WCHAR *msg); // 메시지송신함수 void SendData(CHAR *data); // 데이터송신함수 순천향대학교컴퓨터학부이상정 11 TCP 연결설정프로그램 순천향대학교컴퓨터학부이상정 12

채팅서버연결설정 프로그램실행시작시윈속초기화한후채팅서버연결설 정시작 initwinsock() 함수호출하여윈속초기화 ServerStart() 함수를쓰레드로실행하여서버연결설정 클라이언트의접속을받고, 메시지를수신 소켓생성, socket() 서버주소와소켓결합, bind() 연결요청대기, listen() 연결수락, accept() 메시지수신하는 Receive() 함수를쓰레드로실행 프로그램종료시서버중지 ServerStop() 함수 소켓해제 순천향대학교컴퓨터학부이상정 13 클라인언트연결설정 비접속상태에서버튼누르면클라이언트로서버에연결 에디트컨트롤에서서버 IP 주소읽음 Connect() 함수실행하여서버에연결 소켓생성, socket() 연결요청, connect() 메시지수신하는 Receive() 함수를쓰레드로실행 접속상태에버튼을누르면서버와연결종료 Disconnect() 함수 소켓해제 순천향대학교컴퓨터학부이상정 14

예제 48: TCP 연결설정코드 (1) #include <Winsock2.h> #pragma comment(lib,"ws2.lib") #define ID_SEND 505 void create_gui(hwnd hwnd); // 에디트컨트롤, 버튼생성 bool initwinsock(); // 윈속초기화 DWORD WINAPI ServerStart(LPVOID pdata); // 채팅서버시작쓰레드함수 void ServerStop(); // 채팅서버중지함수 bool Connect(); // 서버에연결요청함수 void Disconnect(); // 클라이언트연결중지함수 void ConnectClick(); // Connect 버튼클릭함수 void SendClick(); // Send 버튼클릭함수 DWORD WINAPI Receive(LPVOID pdata); // 메시지수신쓰레드함수 void Send(WCHAR *msg); // 송신함수 HWND hip, hport, hinfo, hconnect, hsend; // 컨트롤핸들 HANDLE hserverthread, hrecvthread; // 쓰레드핸들 SOCKET server, client; // 소켓 bool IsConnected = FALSE, // 연결상태표시플래그 IsClient = FALSE; // 클라이언트로실행중임을표시 WCHAR szip[20], szport[20], szinput[80]; // 에디트컨트롤버퍼 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) 순천향대학교컴퓨터학부이상정 15 예제 48: TCP 연결설정코드 (2) switch (message) case WM_COMMAND: wmid = LOWORD(wParam); wmevent = HIWORD(wParam); switch (wmid) case ID_CONNECT CONNECT: // 버튼클릭함수호출 ConnectClick(); break; case ID_SEND SEND: case ID_IP IP: // 버튼클릭함수호출 SendClick(); break; // Connect 버튼 // Send 버튼 // IP 주소 if (wmevent == EN_CHANGE) GetWindowText(hIP, szip, 20); break; case ID_ PORT: // 포트번호 if (wmevent == EN_CHANGE) GetWindowText(hPort, szport, 20); break; case ID_INPUT: // 입력문자 if (wmevent == EN_CHANGE) GetWindowText(hInput, szip, 80); break; 순천향대학교컴퓨터학부이상정 16

예제 48: TCP 연결설정코드 (3) case IDM_HELP_ABOUT: case WM_CREATE: /// GUI 컨트롤생성 create_gui(hwnd); /// 윈속초기화 if (initwinsock() == FALSE) return 0; /// 채팅서버쓰레드생성하고실행 hserverthread = CreateThread(NULL, 0, ServerStart,(PVOID) NULL, 0, NULL); case WM_PAINT hdc = BeginPaint(hWnd, &ps); // 에디트제목텍스트출력 ExtTextOut(hdc, 10, 25, 0, NULL, L"IP Address", wcslen(l"ip Address"), NULL); ExtTextOut(hdc, 150, 25, 0, NULL, L"Port", wcslen(l"port"), NULL); EndPaint(hWnd, &ps); break; case WM_DESTROY: if (IsClient == TRUE) // 클라이언트로실행중이면 Disconnect(); // 클라이언트연결종료 else // 서버로실행중 ServerStop(); // 서버중지 순천향대학교컴퓨터학부이상정 17 예제 48: TCP 연결설정코드 (4) /// 윈속초기화 bool initwinsock() WSADATA wsadata; int retval; retval = WSAStartup(MAKEWORD(2,2), &wsadata); if (retval!= 0) MessageBox(NULL,L"WSAStartup L"WSASt t Fail",L"", MB_ICONERROR); return FALSE; return TRUE; /// Info 에디트에출력 void OutInfo(WCHAR *text) static WCHAR szinfo[2048] = L""; wcscat(szinfo, text); SetWindowText(hInfo, szinfo); // 새텍스트를버퍼에추가 // 버퍼출력 순천향대학교컴퓨터학부이상정 18

예제 48: TCP 연결설정코드 (5) /// 채팅서버시작, 클라이언트의접속을받고, 메시지를수신 DWORD WINAPI ServerStart(LPVOID St t(lpvoid pdata) sockaddr_in addr; int retval; /// 서버소켓생성 server = socket(af_inet, SOCK_STREAM, 0); if (server == INVALID_SOCKET) MessageBox(NULL,L"SocketCreate L"S t Fail",L"", MB_ICONERROR); return 0; /// 주소 / 포트지정및연결 memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(inaddr_any); // 서버의 IP 주소 addr.sin_port = htons(7000); // 서버포트를 7000 으로지정 retval = bind(server, (struct sockaddr *)&addr, sizeof(addr)); if (retval == SOCKET_ERROR) MessageBox(NULL,L"Bind Fail",L L"", MB_ICONERROR); return 0; 순천향대학교컴퓨터학부이상정 19 예제 48: TCP 연결설정코드 (6) /// 클라이언트접속대기 retval = listen(server, SOMAXCONN); // 클라이언트개수를최대로설정 if (retval == SOCKET_ERROR) MessageBox(NULL,L"Listen Fail",L"", MB_ICONERROR); return 0; /// 메시지출력 OutInfo(L"Server Start... r n"); /// 클라이언트접속 sockaddr_in client_addr; int addrlen; addrlen = sizeof(client_addr); client = accept(server, (struct sockaddr *)&client_addr, &addrlen); if (client == INVALID_SOCKET) MessageBox(NULL,L"Accept Fail",L"", MB_ICONERROR); return 0; IsConnected = TRUE; // 연결상태표시 순천향대학교컴퓨터학부이상정 20

예제 48: TCP 연결설정코드 (7) /// 접속한클라이언트 IP 주소출력 CHAR bip[50]; WCHAR ip[50], szmsg[80]; strcpy(bip, inet_ntoa(client_addr.sin_addr)); // 숫자 IP주소를문자열로변환 mbstowcs(ip, bip, strlen(bip)+1); // ASCII 문자를유니코드로변환 wsprintf(szmsg, L"IP %s is connected r n", ip); OutInfo(szMsg); /// Receive 쓰레드생성및실행 hrecvthread = CreateThread(NULL, 0, Receive,(PVOID) NULL, 0, NULL); return 0; /// 채팅서버중지함수 void ServerStop() if (IsConnected == TRUE) // 클라이언트연결상태이면 IsConnected = FALSE; // Receive 쓰레드종료 closesocket(client); // 소켓해제 closesocket(server); 순천향대학교컴퓨터학부이상정 21 예제 48: TCP 연결설정코드 (8) /// Connect 버튼클릭함수 void ConnectClick() if (IsClient == FALSE) // 채팅서버에접속할경우 if (Connect() == FALSE) // 서버에연결요청 MessageBox(NULL,L"Connect Fail",L"", MB_ICONERROR); else IsClient = TRUE; SetWindowText(hConnect, L"Connecting..."); // 버튼타이틀변경 else // 채팅을종료할경우 Disconnect(); // 채팅서버와연결종료 IsClient = FALSE; SetWindowText(hConnect, L"Connect"); // 버튼타이틀변경 /// Send 버튼클릭함수 void SendClick() WCHAR szmsg[100]; Send(szInput); // 메시지송신 순천향대학교컴퓨터학부이상정 22

예제 48: TCP 연결설정코드 (9) // 메시지출력 wsprintf(szmsg, L"Send> %s r n", szinput); OutInfo(szMsg); SetWindowText(hInput, L""); // 서버에연결요청함수 bool Connect() sockaddr_in serveraddr; CHAR bip[20]; int retval, port; /// 소켓생성 client = socket(af_inet, SOCK_STREAM, 0); if (client == INVALID_SOCKET) return FALSE; /// 접속할서버주소 / 포트지정및연결 wcstombs(bip, szip, wcslen(szip)+1); // IP 주소유니코드를 ASCII 문자로변환 port = _wtoi(szport); // 포트번호문자열을정수로변환 memset(&serveraddr, 0, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; serveraddr.sin_addr.s_addr = inet_addr(bip); // 서버의 IP 주소 serveraddr.sin_port = htons(port); // 포트번호 순천향대학교컴퓨터학부이상정 23 예제 48: TCP 연결설정코드 (10) retval = connect(client, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); if (retval == SOCKET_ERROR) return FALSE; OutInfo(L"Connecting to the server... r n"); // 메시지출력 IsConnected = TRUE; /// Receive 쓰레드생성및실행 hrecvthread = CreateThread(NULL, 0, Receive,(PVOID) NULL, 0, NULL); return TRUE; // 클라이언트연결중지함수 void Disconnect() if (IsConnected == TRUE) // 클라이언트연결상태이면 IsConnected = FALSE; // Receive 쓰레드종료 closesocket(client); // 소켓해제 OutInfo(L"Connection is closed. r n"); // 메시지출력 순천향대학교컴퓨터학부이상정 24

예제 48: TCP 연결설정코드 (11) /// 메시지수신쓰레드더미함수 DWORD WINAPI Receive(LPVOID pdata) return 0; /// 메시지송신더미함수 void Send(WCHAR *msg) return; 순천향대학교컴퓨터학부이상정 25 TCP 데이터송수신 순천향대학교컴퓨터학부이상정 26

데이터송수신 TCP 소켓은프로토콜내부에서 TCP 버퍼를사용 데이터버퍼와메시지경계문제발생 데이터버퍼가 TCP 버퍼보다작으면한번에송수신못함 따라서데이터송수신전에먼저데이터크기를송수신 Receive() 쓰레드함수가데이터수신 ReceiveData() 함수호출하여수신 받을데이터크기수신 지정된크기의데이터수신시까지수신반복 Send() 함수가데이터송신 SendData() 함수호출하여송신 보낼데이터크기계산하여송신 지정된데이터크기만큼데이터송신반복 순천향대학교컴퓨터학부이상정 27 예제 48: 데이터송수신코드 (1) #include <Winsock2.h> #pragma comment(lib,"ws2.lib") #define ID_SEND 505 void create_gui(hwnd hwnd); // 에디트컨트롤, 버튼생성 bool initwinsock(); // 윈속초기화 DWORD WINAPI ServerStart(LPVOID pdata); // 채팅서버시작쓰레드함수 void ServerStop(); // 채팅서버중지함수 bool Connect(); // 서버에연결요청함수 void Disconnect(); // 클라이언트연결중지함수 void ConnectClick(); // Connect 버튼클릭함수 void SendClick(); // Send 버튼클릭함수 DWORD WINAPI Receive(LPVOID pdata); // 메시지수신쓰레드함수 CHAR *ReceiveData(); // 데이터수신함수 void Send(WCHAR *msg); // 메시지송신함수 void SendData(CHAR *data); // 데이터송신함수 HWND hip, hport, hinfo, hconnect, hsend; // 컨트롤핸들 HANDLE hserverthread, hrecvthread; // 쓰레드핸들 SOCKET server, client; // 소켓 bool IsConnected = FALSE, // 연결상태표시플래그 IsClient = FALSE; // 클라이언트로실행중임을표시 WCHAR szip[20], szport[20], szinput[80]; // 에디트컨트롤버퍼 순천향대학교컴퓨터학부이상정 28

예제 48: 데이터송수신코드 (2) /// 메시지수신쓰레드함수 DWORD WINAPI Receive(LPVOID pdata) WCHAR szmsg[100], sztext[80]; while (IsConnected == TRUE) // 데이터를수신 CHAR *data = ReceiveData(); if (data!= NULL) // 수신메시지출력 mbstowcs(sztext, data, strlen(data)+1); // ASCII 문자를유니코드로변환 wsprintf(szmsg, L"Recv> %s r n", sztext); OutInfo(szMsg); return 0; 순천향대학교컴퓨터학부이상정 29 예제 48: 데이터송수신코드 (3) /// 데이터수신함수 CHAR *ReceiveData() CHAR data_size[4], *data; UINT offset = 0, // 버퍼내위치 size = 0, // 수신할데이터크기 recv_size = 0, // 수신한데이터크기 left_size; // 남은데이터크기 // 데이터크기수신 recv_size = recv(client, data_size, 4, 0); if (recv_size!= SOCKET_ERROR) size = ntohl(*(uint *)data_size); left_size = size; // 데이터크기수신 // nework-to-host 바이트변환 data = new CHAR[size+1]; // 데이터수신 while (offset < size) recv_size = recv(client, data+offset, left_size, 0); if (recv_size == 0) break; offset += recv_size; left_size -= recv_size; return data; 순천향대학교컴퓨터학부이상정 30 else return NULL; // 데이터수신

예제 48: 데이터송수신코드 (4) /// 메시지송신함수 void Send(WCHAR *msg) CHAR bmsg[80]; if (IsConnected == TRUE) wcstombs(bmsg, msg, wcslen(msg)+1); SendData(bmsg); // 데이터를송신 else OutInfo(L"Send Fail r n"); // 유니코드를 ASCII 로변환 순천향대학교컴퓨터학부이상정 31 예제 48: 데이터송수신코드 (5) /// 데이터송신함수 void SendData(CHAR *data) CHAR data_size[4]; UINT offset = 0, size = strlen(data)+1, send_size = 0, left_size = size; // 버퍼내위치 // 송신할데이터크기 // 송신한데이터크기 // 남은데이터크기 // 데이터크기송신 *(UINT *)data_size = htonl(size); send_size = send(client, data_size, 4, 0); // host-to-network 바이트변환 // 데이터크기송신 // 데이터송신 while (offset < size) send_size = send(client, data+offset, left_size, 0); offset += send_size; left_size -= send_size; // 데이터수신 순천향대학교컴퓨터학부이상정 32

과제 16 예제 48 의채팅프로그램에서출력및대화내용을파일로저장하는메뉴추가 순천향대학교컴퓨터학부이상정 33 과제 16 순천향대학교컴퓨터학부이상정 34