ÇöÀç°Á : 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 À©¼Ó äÆà ¼¹ö