ÇöÀç°­Á : Winsock ÇÁ·Î±×·¡¹Ö ÀÌÀü: 5.3 À©¼Ó äÆà ¼­¹ö


5.4 À©¼Ó äÆà Ŭ¶óÀ̾ðÆ®

¢º À©¼Ó äÆà Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ WChat_Client.c´Â »ç¿ëÀÚ°¡ Å°º¸µå¿¡¼­ ÀÔ·ÂÇÑ ¹®ÀÚ¿­À» ¼­¹ö¿¡°Ô Àü¼ÛÇÏ°í ¼­¹ö°¡ º¸³»¿Â ¸Þ½ÃÁö¸¦ È­¸é¿¡ Ãâ·ÂÇÏ´Â ±â´ÉÀ» ¼öÇàÇÑ´Ù.

¢º ±×¸² 5-3Àº äÆà Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ÀÇ ½ÇÇà ¿¹ÀÌ´Ù (±×¸² 5-3À» ±¸¼ºÇÏ´Â ¸®¼Ò½º ÆÄÀÏ Client.rc´Â Visual C·Î ÀÛ¼ºÇÏ¿´´Ù).

±×¸² 5-3 äÆà Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥ ½ÇÇà ¿¹

5.4.1 ÇÁ·Î±×·¥ ÁÖ¿äºÎºÐ ¼³¸í

(1) Çì´õ ÆÄÀÏ°ú Àü¿ªº¯¼ö

¢º WChat_Client.c´Â ´ÙÀ½°ú °°Àº Çì´õ ÆÄÀÏ°ú Àü¿ªº¯¼ö¸¦ ÇÊ¿ä·Î ÇÑ´Ù.

#include <windows.h> /* À©µµ¿ì ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¸¶½ºÅÍ Çì´õ ÆÄÀÏ */

#include <stdlib.h> /* ¹®ÀÚ Ã³¸®¸¦ À§ÇÑ Çì´õ ÆÄÀÏ */

#include <Winsock.h> /* À©¼Ó °ü·Ã »ó¼ö ¹× ÇÔ¼ö ¼±¾ð */

#include "Client.h" /* ¸®¼Ò½º ÆÄÀÏ */

HINSTANCE hInst; /* ÇöÀç À©µµ¿ìÀÇ ÀνºÅϽº */

WNDPROC OldProc; /* ¼­ºêŬ·¡½ÌÀ» Çϱâ À§ÇØ ÀúÀåÇÒ ±âÁ¸ÀÇ ÇÁ·Î½ÃÁ® */

char msg[512]; /* ÀÔÃâ·Â¿ë µ¥ÀÌÅÍ */

SOCKET m_s; /* ¼ÒÄϹøÈ£ */

SOCKADDR_IN m_addr; /* ÀÎÅÍ³Ý Å¸ÀÔÀÇ ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ */

HWND hParent; /* Parent À©µµ¿ìÀÇ ÇÚµé */

(2) WM_INITDIALOGÀÇ Ã³¸®

¢º À©µµ¿ì°¡ óÀ½ »ý¼³µÉ ¶§ ¹ß»ýÇÏ´Â ¸Þ½ÃÁöÀÎ WM_ INITDIALOGÀÇ Ã³¸®ºÎ¿¡¼­´Â ´ÙÀ½°ú °°ÀÌ À©¼ÓÀÇ ÃʱâÈ­(InitSocket())¿Í ´ÙÀ½¿¡ ¼³¸íÇÑ ¿¡µðÆ® ÄÁÆ®·Ñ ¼­ºêŬ·¡½Ì(subclassing)À» ¼öÇàÇÑ´Ù.

case WM_INITDIALOG:

memset(msg, '\0', sizeof(msg));

if(!InitSocket(hWnd))

return FALSE;

OldProc = (WNDPROC) SetWindowLong (GetDlgItem(hWnd, IDC_EDIT),

GWL_WNDPROC, (LONG)EditProc);

return TRUE;

(3) ¼­ºêŬ·¡½Ì

¢º Ŭ¶óÀ̾ðÆ® ÇÁ·Î±×·¥Àº ´ÙÀ̾ó·Î±× ¹Ú½º·ÎºÎÅÍ ½ÇÇàÀÌ ½ÃÀ۵Ǵµ¥ ¿¡µðÆ® ÄÁÆ®·Ñ(edit control)À» ÅëÇÏ¿© µ¥ÀÌÅ͸¦ ÀԷ¹޴´Ù.

¢º ¿¡µðÆ® ÄÁÆ®·Ñ¿¡¼­´Â »ç¿ëÀÚ°¡ ¸®ÅÏ('\n')±îÁö ÀÔ·ÂÇÑ ¹®ÀÚ¿­À» ¹Þ¾Æ, »ç¿ëÀÚ Á¤ÀÇ ¸Þ½ÃÁöÀÎ WM_ASYNC¸¦ ÀÌ¿ëÇÏ¿© ó¸®ÇÑ´Ù. À̸¦ À§ÇÏ¿© ¼­ºêŬ·¡½ÌÀ» »ç¿ëÇÑ´Ù.

¢º ¼­ºêŬ·¡½ÌÀ̶õ À©µµ¿ì¿¡¼­ ¼öÇàµÇ´ø ÇÁ·Î½ÃÁ®¸¦ »ç¿ëÀÚ Á¤ÀÇ ÇÁ·Î½ÃÁ®·Î ¿¬°áÇÏ¿© ¿øÇÏ´Â ÀÛ¾÷À» ÇÏ´Ù°¡ ±× ÀÛ¾÷ÀÌ ¿Ï·áµÇ¸é ´Ù½Ã ¿ø·¡ÀÇ ÇÁ·Î½ÃÁ®·Î µÇµ¹¾Æ¿À´Â ±â´ÉÀ» ¸»ÇÑ´Ù.

¢º º» ¿¹Á¦¿¡¼­´Â ¼­ºêŬ·¡½ÌÀ» ÀÌ¿ëÇÏ¿© »ç¿ëÀÚ°¡ ¸®ÅÏÅ°¸¦ ÀÔ·ÂÇÑ »ç½ÇÀ» Parent À©µµ¿ì¿¡ ¾Ë·ÁÁØ´Ù.

¢º ¾Æ·¡ÀÇ ÇÁ·Î±×·¥ ÄÚµå´Â ÇöÀçÀÇ ÇÁ·Î½ÃÁ®¸¦ OldProc·Î Àá½Ã ÀúÀåÇÏ°í »ç¿ëÀÚ ÇÁ·Î½ÃÁ®ÀÎ EditProc¸¦ µî·ÏÇÏ´Â °ÍÀ» ³ªÅ¸³½´Ù.

OldProc = (WNDPROC) SetWindowLong (GetDlgItem(hWnd, IDC_EDIT),

GWL_WNDPROC, (LONG)EditProc);

¢º À§¿¡¼­ IDC_EDIT´Â ¿¡µðÆ® ÄÁÆ®·ÑÀÇ IDÀ̸ç, EditProc´Â ¿¡µðÆ® ÄÁÆ®·ÑÀ» ó¸®Çϱâ À§ÇØ »õ·Î Á¤ÀÇÇÑ ÇÁ·Î½ÃÁ® À̸§ÀÌ´Ù.

(4) WM_CHAR ¸Þ½ÃÁö ó¸®

¢º¾Æ·¡´Â EditProcÀÇ ±¸Çö ³»¿ëÀ¸·Î, »ç¿ëÀÚ°¡ Å°º¸µå·Î ±ÛÀÚ¸¦ ÀÔ·ÂÇÏ¿´À» ¶§ ¹ß»ýÇÏ´Â ¸Þ½ÃÁö WM_CHAR¸¦ ó¸®ÇÑ´Ù.

¢º ¸®ÅÏÅ°¸¦ Á¦¿ÜÇÑ ´Ù¸¥ ¹®ÀÚµéÀº ¸ðµÎ ¿ø·¡ÀÇ ÇÁ·Î½ÃÁ®·Î º¸³»¸ç(CallWindowProc() È£Ãâ) »ç¿ëÀÚ°¡ ¸®ÅÏÅ°¸¦ ´©¸£¸é Áö±Ý±îÁö ¿¡µðÆ® ÄÁÆ®·Ñ¿¡ ÀúÀåµÈ µ¥ÀÌÅ͸¦ GetWindowText() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¾ò¾î¿Â ÈÄ PostMessage()¸¦ »ç¿ëÇÏ¿© »ç¿ëÀÚ Á¤ÀÇ ¸Þ½ÃÁö WM_ASYNC¸¦ ¹ß»ý½ÃŲ´Ù.

LRESULT CALLBACK EditProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {

switch(iMsg) {

case WM_CHAR:

if(wParam == VK_RETURN) { /* ¸®ÅÏÅ° ÀÔ·Â */

/* ÇöÀç ¿¡µðÆ® ÄÁÆ®·Ñ¿¡ ÀúÀåµÈ ¹®ÀÚ¿­À» ¾ò´Â´Ù */

GetWindowText(hWnd, (LPTSTR)msg, sizeof(msg));

/* WM_ASYNC ¸Þ½ÃÁö ¹ß»ý */

PostMessage(hParent, WM_ASYNC, m_s,

WSAMAKESELECTREPLY(FD_WRITE, 0));

SetWindowText(hWnd, "");

break;

}

}

/* ¸®ÅÏÅ°°¡ ¾Æ´Ï¸é ¿ø·¡ÀÇ ÇÁ·Î½ÃÁ®·Î ¹®ÀÚ¿­À» ÀÔ·Â */

return CallWindowProc(OldProc, hWnd, iMsg, wParam, lParam);

}

(5) WM_COMMANDÀÇ Ã³¸®

¢º "Á¾·á" ¹öÆ°ÀÌ ´­¸± ¶§ ¹ß»ýÇÏ´Â ¸Þ½ÃÁö·Î ¼ÒÄÏÀ» Á¾·áÇϱâ À§ÇÏ¿© WSACleanup()À» È£ÃâÇÏ°í À©µµ¿ì¿¡ Á¾·á ¸Þ½ÃÁö WM_DESTROY¸¦ º¸³»±â À§ÇÏ¿© Destroy- Window() ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

case WM_COMMAND:

switch(wParam) {

case IDC_EXIT: /* Á¾·á¹öÆ° ÀԷ ó¸® */

closesocket(m_s);

m_s = INVALID_SOCKET; /* ¼ÒÄÏÀ» ¿ø»óÅ·ΠÃʱâÈ­ */

WSACleanup();

DestroyWindow(hWnd); /* WM_DESTROY ¹ß»ý */

return TRUE;

}

break;

(6) WM_DESTROYÀÇ Ã³¸®

¢º À§ÀÇ DestroyWindow()¿¡ ÀÇÇØ À©µµ¿ì ³»ºÎÀûÀ¸·Î ¹ß»ýÇÏ´Â ¸Þ½ÃÁö·Î¼­ À©µµ¿ì¸¦ Á¾·á½Ãų ¶§ »ç¿ëµÈ´Ù.

¢º ¾Æ·¡¿¡¼­ PostQuitMessage() ÇÔ¼ö´Â À©µµ¿ì ¸Þ½ÃÁö Å¥¿¡ Á¾·á ¸Þ½ÃÁö¸¦ Àü¼ÛÇÑ´Ù.

case WM_DESTROY:

PostQuitMessage(0);

return TRUE;

¡¡

(7) WM_ASYNCÀÇ Ã³¸®

¢º ¼­¹ö¿ÍÀÇ ¿¬°á, ¿¬°áÁ¾·á, µ¥ÀÌÅÍ ¼Û¼ö½Å µîÀº ½Ã½ºÅÛÀÇ I/O º¯È­½Ã ¹ß»ýÇÏ´Â ¸Þ½ÃÁö WM_ASYNC¸¦ ÀÌ¿ëÇÏ¿© 󸮵ȴÙ.

¢º ¹ß»ýÇÑ À̺¥Æ®ÀÇ Á¾·ù¸¦ ±¸ºÐÇϱâ À§ÇÏ¿© ¸ÅÅ©·Î WSA- GETSELECTEVENT()¸¦ »ç¿ëÇÑ´Ù.

¢º WChat_Client.c¿¡¼­ ó¸®ÇØ¾ß ÇÒ À̺¥Æ®ÀÇ Á¾·ù´Â FD_ CONNECT, FD_CLOSE, FD_WRITE, FD_READÀ̸ç À̵éÀ» °¢°¢ ó¸®ÇÏ´Â °ÍÀ» ¾Æ·¡¿¡ º¸¿´´Ù.

case WM_ASYNC:

hListBox = GetDlgItem(hWnd, IDC_LIST);

switch(WSAGETSELECTEVENT(lParam)) {

case FD_CONNECT:

/* ¼­¹ö¿Í ¿¬°á ó¸® */

case FD_CLOSE:

/* ¼ÒÄÏ Á¾·á ó¸® */

case FD_WRITE:

/* äÆà µ¥ÀÌÅÍ ¼Û½Å ó¸® */

case FD_READ:

/* äÆà µ¥ÀÌÅÍ ¼ö½Å ó¸® */

default:

break;

}

¢º WChat_Client.c ÇÁ·Î±×·¥


ÇöÀç°­Á : Winsock ÇÁ·Î±×·¡¹Ö ÀÌÀü: 5.3 À©¼Ó äÆà ¼­¹ö