ÇöÀç°Á : Winsock ÇÁ·Î±×·¡¹Ö ÀÌÀü: 5.2 À©¼ÓÀÇ µ¿ÀÛ ´ÙÀ½: 5.4 À©¼Ó äÆà Ŭ¶óÀ̾ðÆ®
5.3 À©¼Ó äÆà ¼¹ö
¢º ¿©±â¼´Â 4.2Àý°ú 4.3Àý¿¡¼ ¼Ò°³ÇÑ UNIX¿ë äÆà ÇÁ·Î±×·¥À» PC¿¡¼ À©¼ÓÀ» »ç¿ëÇÏ¿© ±¸ÇöÇÏ´Â °ÍÀ» ¼Ò°³ÇÑ´Ù.
¢ºÃ¤Æà ¼¹ö¿Í Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á°ü°è ±×¸®°í ¼¹ö¿¡¼ »ç¿ëÇÏ´Â ¼ÒÄÏÀÇ Á¾·ù(m_sAccept¿Í m_sClient[])¸¦ ±×¸² 5-1¿¡ ³ªÅ¸³Â´Ù.
±×¸² 5-1 À©¼Ó äÆà ¼¹ö¿Í À©¼Ó äÆà Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á°ü°è
(m_sAccept:Ãʱâ¼ÒÄÏ, m_sClient[]: äÆà Âü°¡ÀÚÀÇ ¼ÒÄϹøÈ£ ¹è¿)
¢º äÆà ¼¹ö´Â Ŭ¶óÀ̾ðÆ®ÀÇ Á¢¼Ó¿äûÀ» ¼ö¶ôÇÏ´Â ÀÏ°ú ¾î¶² Ŭ¶óÀ̾ðÆ®°¡ º¸³»¿Â ¸Þ½ÃÁö¸¦ ¸ðµç Ŭ¶óÀ̾ðÆ®¿¡°Ô ¹æ¼ÛÇÏ´Â µÎ °¡Áö ÀÏÀ» ¼öÇàÇÑ´Ù.
¢º À̸¦ À§ÇÏ¿© ¼¹ö´Â µÎ °¡Áö Á¾·ùÀÇ ¼ÒÄÏÀ» ÇÊ¿ä·Î Çϴµ¥ ù¹ø°´Â Á¢¼Ó¿äûÀ» ±â´Ù¸®´Â ¼ÒÄÏ(m_sAccept)À̸ç, µÎ¹ø°´Â äÆÿ¡ Âü°¡ÇÏ´Â °¢ Ŭ¶óÀ̾ðÆ®µé°ú ¸Þ½ÃÁö¸¦ ÁÖ°í¹Þ±â À§ÇÑ ¼ÒÄÏÀÌ´Ù.
¢º À̸¦ À§ÇÏ¿© ¼ÒÄÏÀÇ ¹è¿(m_sClient[])À» »ç¿ëÇÑ´Ù(ÀÌ·¯ÇÑ µ¿ÀÛ °³³äÀ» 4.2Àý¿¡¼µµ »ç¿ëÇÏ¿´À½).
¢º ¼¹ö´Â ¸ÕÀú Ãʱâ¼ÒÄÏ(m_sAccept)À» »ý¼ºÇÏ°í ¿©±â¿¡ accept()¸¦ È£ÃâÇØ µÐ´Ù.
¢º ÀÌ ¼ÒÄÏÀ¸·Î ¾î¶² Ŭ¶óÀ̾ðÆ®°¡ äÆÿ¡ Âü°¡Çϱ⸦ ½ÅûÇϸé accept()°¡ 󸮵ǰí, accept()°¡ ¸®ÅÏÇÑ »õ·Î¿î ¼ÒÄϹøÈ£¸¦ ¹è¿ m_sClient[]¿¡ Â÷·Ê·Î ÀúÀåÇÏ°Ô µÈ´Ù.
¢º ±×¸² 5-2´Â ¼¹ö ÇÁ·Î±×·¥ÀÇ ½ÇÇà ¿¹ÀÌ´Ù. ¼¹ö ÇÁ·Î±×·¥ WChat_Server.cÀÇ Àüü ¸®½ºÆ®´Â 5.3.2Àý¿¡ ¼ö·ÏµÇ¾î ÀÖÀ¸¸ç ¸ÕÀú ÇÁ·Î±×·¥ÀÇ ÁÖ¿äºÎºÐÀ» ¼³¸íÇÏ°Ú´Ù.
±×¸² 5-2 À©¼Ó ¼¹ö ÇÁ·Î±×·¥ ½ÇÇà ȸé
5.3.1 ÇÁ·Î±×·¥ ÁÖ¿äºÎºÐ ¼³¸í
(1) Çì´õ ÆÄÀÏ
¢º Server.h ÆÄÀÏÀº ±×¸² 5-2¿Í °°Àº ȸéÀ» ±¸¼ºÇÏ´Â Á¤º¸¸¦ °¡Áö°í ÀÖ´Â ÆÄÀÏ·Î ÀÌ Ã¥¿¡¼´Â Visual C·Î ÀÛ¼ºÇÏ¿´´Ù.
#include
<windows.h> /* À©µµ¿ì
ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¸¶½ºÅÍ Çì´õ ÆÄÀÏ */ #include <Winsock.h> /* À©¼Ó °ü·Ã »ó¼ö ¹× ÇÔ¼ö ¼±¾ð */ #include "Server.h" /* ¸®¼Ò½º ÆÄÀÏ */ |
(2) Àü¿ª º¯¼ö
¢º äÆà ¼¹ö ÇÁ·Î±×·¥¿¡¼ »ç¿ëÇÏ´Â Àü¿ª º¯¼ö¿Í °¢°¢ÀÇ ±â´ÉÀº ´ÙÀ½°ú °°´Ù.
SOCKET m_sAccept;
/* äÆà Âü°¡½ÅûÀ» ¹Þ±â
À§ÇÑ ¼ÒÄÏ */ SOCKET m_sClient[]; /* °¢ Ŭ¶óÀ̾ðÆ®¿Í ¸Þ½ÃÁö¸¦ ÁÖ°í¹Þ±â À§ÇÑ ¼ÒÄÏ ¹è¿ */ char m_strMsg[]; /* ¸Þ½ÃÁö¸¦ ÀúÀåÇÒ ¹öÆÛ */ int m_Total; /* äÆÿ¡ Âü°¡ÇÏ°í Àִ Ŭ¶óÀ̾ðÆ® ¼ö */ HWND hWnd; /* À©µµ¿ì ÇÚµé */ |
(3) WinMain() ÇÔ¼ö
¢º º» ¿¹Á¦¿¡¼´Â À©µµ¿ì ´ëÈ»óÀÚ(DialogBox)¸¦ ¸ÞÀÎ À©µµ¿ì·Î »ç¿ëÇÏ°í ÀÖ´Ù.
¢º ¾Æ·¡ÀÇ ÄÚµå´Â WinMain() Áß¿¡¼ CreateDialog()·Î ´ëÈ»óÀÚ¸¦ »ý¼ºÇÏ°í, GetMessage()·Î ´ëÈ»óÀÚ¿¡ µµÂøÇÏ´Â ¸Þ½ÃÁö¸¦ ¹Þ¾Æ À̸¦ ó¸®ÇÏ´Â ·çÇÁ¸¦ º¸ÀÌ°í ÀÖ´Ù.
if((hWnd =
CreateDialog(hInstance, MAKEINTRESOURCE(IDD_SERVER),
NULL, HandleDialog)) == NULL) { MessageBox(NULL, "ÃʱâÈ ¿¡·¯", "È®ÀÎ", MB_OK); return FALSE; } while(GetMessage(&msg, NULL, 0, 0)) { if(!IsDialogMessage(hWnd, &msg)) { TranslateMessage(&msg); /* ¸Þ½ÃÁö Å¥¿¡¼ ¸Þ½ÃÁö¸¦ °¡Áö°í ¿È */ DispatchMessage(&msg); /* ¸Þ½ÃÁö¸¦ ºÐ¼®ÇÑ´Ù */ } } |
(4) ¸Þ½ÃÁö ó¸®
¢º WChat_Server.c¿¡¼ ó¸®ÇØ¾ß ÇÒ ¸Þ½ÃÁö´Â ¾Æ·¡¿Í °°ÀÌ ³× °¡ÁöÀÌ¸ç °¢ ¸Þ½ÃÁö°¡ ¹ß»ýÇÏ´Â Á¶°ÇÀº ´ÙÀ½°ú °°´Ù.
¢º WM_INITDIALOG: ´ÙÀ̾ó·Î±× ¹Ú½º°¡ »ý¼ºµÉ ¶§ ¹ß»ýÇϴµ¥ WChat_Server.c¿¡¼´Â ÀÌ ¸Þ½ÃÁö°¡ ¹ß»ýÇϸé Àü¿ª º¯¼öµé°ú À©¼ÓÀ» ÃʱâÈÇÑ ÈÄ Å¬¶óÀ̾ðÆ®ÀÇ ¿¬°á¿äûÀ» ±â´Ù¸®±â À§ÇØ »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼öÀÎ InitSocket()À» È£ÃâÇÑ´Ù.
¢º WM_COMMAND: ¸Þ´º, ¸®½ºÆ®¹Ú½º, ¹öÆ°, üũ¹Ú½º µî¿¡¼ ¹ß»ýÇÏ´Â ¸Þ½ÃÁö·Î WChat_Server.c¿¡¼´Â »ç¿ëÀÚ°¡ Á¾·á¹öÆ°À» Ŭ¸¯ÇÒ ¶§¸¸ ¹ß»ýÇÑ´Ù.
¢º WM_DESTROY: À©µµ¿ì°¡ Á¾·áµÉ ¶§ ³»ºÎÀûÀ¸·Î ¹ß»ýÇÑ´Ù.
¢º WM_ASYNC: WChat_Server.c¿¡¼ Á¤ÀÇÇÑ ¸Þ½ÃÁö·Î ¼ÒÄÏÀ» ÅëÇÏ¿© µ¥ÀÌÅ͸¦ ºñµ¿±â ¸ðµå·Î ó¸®ÇÏ´Â µ¥ »ç¿ëµÈ´Ù.
¢º ¸Þ½ÃÁöÀÇ Ã³¸®´Â HandleDialog() ÇÔ¼ö¿¡¼ ÀÌ·ç¾îÁö´Âµ¥ HandleDialog()°¡ ÇÔ¼ö ÀÎÀÚ·Î ¸®ÅÏÇÏ´Â ¸Þ½ÃÁö iMsgÀÇ Á¾·ù¿¡ µû¶ó ÇØ¾ß ÇÒ ÀÏÀ» ´ÙÀ½°ú °°ÀÌ ±¸ºÐÇÑ´Ù.
BOOL CALLBACK
HandleDialog(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch(iMsg) { case WM_INITDIALOG: /* Àü¿ª º¯¼ö ¹× À©¼Ó ÃʱâÈ */ case WM_COMMAND: /* "Á¾·á" ¹öÆ° ÀԷ ó¸® */ case WM_DESTROY: /* ÇÁ·Î±×·¥ Á¾·á */ case WM_ASYNC: /* ºñµ¿±â ¸Þ½ÃÁö ó¸® */ } } |
(5) WM_INITDIALOGÀÇ Ã³¸®
¢º WChat_Server.c¿¡¼´Â WM_INITDIALOG ¸Þ½ÃÁö°¡ ¹ß»ýÇÏ¸é »ç¿ëÀÚ Á¤ÀÇ ÇÔ¼öÀÎ InitSocket()À» È£ÃâÇϵµ·Ï ÇÏ¿´´Ù.
¢º InitSocket() ÇÔ¼ö¿¡¼´Â WSAStartup() ½Ã½ºÅÛ ÄÝÀ» È£ÃâÇÏ¿© Winsock.dllÀ» ÃʱâÈÇÑ´Ù.
¢º À©¼Ó¿¡¼µµ ¼ÒÄÏÀÇ »ý¼ºÀº BSD ¼ÒÄÏ¿¡¼¿Í °°ÀÌ socket() ÇÔ¼ö¸¦ ÅëÇؼ ÀÌ·ç¾îÁø´Ù
¢º ¾Æ·¡´Â ¼ÒÄÏÀ» ¸¸µé°í ¼ÒÄϹøÈ£(m_sAccept)¿Í ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ serv_addr¸¦ bind()ÇÑ ÈÄ listen()À» È£ÃâÇÏ´Â °ÍÀ» º¸ÀÌ°í ÀÖ´Ù.
#define CHAT_PORT 7001 /* Æ÷Æ®¹øÈ£·Î 7001¹ø »ç¿ë */
m_sAccept = socket(AF_INET, SOCK_STREAM, 0);
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(CHAT_PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(m_sAccept, (LPSOCKADDR)&serv_addr, sizeof(serv_addr));
listen(m_sAccept, 5);
(6) WM_COMMANDÀÇ Ã³¸®
¢º WM_COMMAND ¸Þ½ÃÁö´Â »ç¿ëÀÚ°¡ ¹öÆ°, ¸®½ºÆ®¹Ú½º, üũ¹Ú½º, ¿¡µðÆ®¹Ú½º, ¸Þ´º µîÀ» »ç¿ëÇÒ ¶§ ¹ß»ýÇÏ´Â ¸Þ½ÃÁöÀÌ´Ù.
¢º º» ÇÁ·Î±×·¥¿¡¼´Â "Á¾·á" ¹öÆ°ÀÌ ´¸± ¶§ ¹ß»ýÇÏ´Â ¸Þ½ÃÁö¸¸ ó¸®ÇÏ¸é µÈ´Ù.
¢º ¾Æ·¡ÀÇ WM_COMMAND 󸮺κп¡¼ wParamÀº À§¿¡ ¿°ÅÇÑ °Í°ú °°Àº ¿©·¯ Á¾·ùÀÇ ¸Þ½ÃÁö¸¦ ±¸ºÐÇÏ´Â ÆĶó¹ÌÅÍÀ̸ç IDC_EXIT´Â Á¾·á ¹öÆ°ÀÇ IDÀÌ´Ù.
¢º ÇÑÆí DestroyWindow() ÇÔ¼ö´Â À©µµ¿ì ³»ºÎ¿¡ WM_ DESTROY ¸Þ½ÃÁö¸¦ º¸³»ÁØ´Ù.
case WM_COMMAND:
switch(wParam) { case IDC_EXIT: DestroyWindow(hWnd); return TRUE; } |
(7) WM_DESTROYÀÇ Ã³¸®
¢º WM_DESTROY´Â (À§ÀÇ DestroyWindow()¿¡ ÀÇÇØ) À©µµ¿ì¿¡¼ ³»ºÎÀûÀ¸·Î ¹ß»ýµÇ´Â ¸Þ½ÃÁö·Î À©µµ¿ì¸¦ Á¾·á½Ãų ¶§ »ç¿ëµÈ´Ù.
¢º ´ÙÀ½ÀÇ Äڵ忡¼ PostQuitMessage()´Â À©µµ¿ì ¸Þ½ÃÁö Å¥¿¡ Á¾·á ¸Þ½ÃÁö¸¦ Àü¼ÛÇÏ´Â ÇÔ¼öÀÌ´Ù.
case WM_DESTROY:
PostQuitMessage(0); return TRUE; |
(8) WM_ASYNCÀÇ Ã³¸®
¢ºÀ©¼Ó¿¡¼´Â ¼ÒÄÏÀÌ ºí·ÎÅ· ¸ðµå·Î µ¿ÀÛÇÒ ¶§ÀÇ ¹®Á¦Á¡À» ÇØ°áÇϱâ À§Çؼ WSAAsyncSelect() ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.
¢º WChat_Server.c¿¡¼´Â WSAAsyncSelect()°¡ WM_ASYNC¶ó´Â ¸Þ½ÃÁö¸¦ ¹ß»ý½ÃÅ°µµ·Ï ÇÏ¿´´Ù.
¢º WChat_Server.c¿¡¼´Â ºñµ¿±â ¸ðµå·Î I/O¸¦ ó¸®Çϱâ À§ÇÏ¿© WSAAsyncSelect()¸¦ ¾Æ·¡¿Í °°ÀÌ µÎ °¡Áö ¼ÒÄÏ¿¡ ´ëÇÏ¿© °¢°¢ È£ÃâÇØ¾ß ÇÑ´Ù.
1) accept()¸¦ ºñµ¿±âÀûÀ¸·Î ó¸®Çϱâ À§ÇÏ¿© Ãʱâ¼ÒÄÏ(m_sAccept)¿¡ ´ëÇÏ¿© È£ÃâÇÏ´Â °Í.
2) °¢ Ŭ¶óÀ̾ðÆ®µé°ú äÆà ¸Þ½ÃÁö¸¦ ºñµ¿±âÀûÀ¸·Î ¼Û¼ö½ÅÇϱâ À§ÇÏ¿© ¼ÒÄÏ ¹è¿ m_sClient[]¿¡ ´ëÇÏ¿© È£ÃâÇÏ´Â °Í.
¢º 1)¹øÀÇ °æ¿ì WSAAsyncSelect()¸¦ È£ÃâÇÏ´Â °ÍÀ» ¾Æ·¡¿¡ º¸¿´´Ù.
¢º m_sAccept´Â FD_ACCEPT À̺¥Æ® ¹ß»ýÀ» °¨½ÃÇÒ Ãʱâ¼ÒÄÏÀÇ ¹øÈ£ÀÌ°í m_hWnd´Â FD_ACCEPT À̺¥Æ®°¡ ¹ß»ýÇßÀ» ¶§ ¸Þ½ÃÁö¸¦ ¹ÞÀ» À©µµ¿ì ÇÚµéÀ̸ç, WM_ASYNC´Â Àü¼ÛÇÒ ¸Þ½ÃÁö¸¦ ³ªÅ¸³½´Ù.
WSAAsyncSelect(m_sAccept, hWnd, WM_ASYNC, FD_ACCEPT);
¢º 2)¹øÀÇ °æ¿ì´Â »õ·Î¿î äÆà Ŭ¶óÀ̾ðÆ®°¡ Ãß°¡·Î ¿¬°áµÉ ¶§ Áï, accept()°¡ ¼º°øÀûÀ¸·Î ¼öÇàµÇ¾úÀ» ¶§ accept()°¡ ¸®ÅÏÇÑ ¼ÒÄϹøÈ£ m_sClient[m_Total]¿¡ ´ëÇÏ¿© ¼öÇàµÈ´Ù(m_TotalÀº ÇöÀç äÆÿ¡ Âü°¡ÇÑ ÃÑ »ç¶÷¼ö).
¢º±×·¯³ª 2)ÀÇ °æ¿ì´Â 1)ÀÇ °æ¿ì¿Í ´Þ¸® °¢ Ŭ¶óÀ̾ðÆ®¿ÍÀÇ µ¥ÀÌÅÍÀÇ ¼Û½Å, ¼ö½Å, Á¾·á µî ¼¼ °¡Áö À̺¥Æ®¸¦ ó¸®ÇÏ¿©¾ß ÇϹǷΠFD_ACCEPT°¡ ¾Æ´Ï¶ó FD_READ|FD_WRITE| FD_CLOSE¸¦ À̺¥Æ® ¸®½ºÆ®·Î ÁöÁ¤ÇÏ¿©¾ß ÇÑ´Ù.
¢º ¾Æ·¡´Â ÀÌ·¯ÇÑ ±â´ÉÀ» ¼öÇàÇÏ´Â ÇÁ·Î±×·¥ ÄÚµåÀÌ¸ç ¿©±â¼ msg¿¡´Â ¸ðµç äÆà °¡ÀÔÀÚ¿¡°Ô º¸³»´Â ¸Þ½ÃÁö°¡ ÀúÀåµÈ´Ù.
cli_len =
sizeof(cli_addr); m_sClient[m_Total] = accept(m_sAccept, (LPSOCKADDR)&cli_addr, &cli_len); WSAAsyncSelect(m_sClient[m_Total], m_hWnd, WM_ASYNC, FD_READ|FD_WRITE|FD_CLOSE); wsprintf(msg, "%d¹ø° Ŭ¶óÀ̾ðÆ® Ãß°¡", m_Total); m_Total++; |
¢º WSAAsyncSelect()¸¦ È£ÃâÇØ µÐ ÀÌÈÄ¿¡ WM_ASYNC ¸Þ½ÃÁö°¡ ¹ß»ýÇÏ¸é ¾î´À ¼ÒÄÏ¿¡¼ ÀÌ ¸Þ½ÃÁö¸¦ ¹ß»ý½ÃÄ×´ÂÁö¸¦ ¾Ë¾Æ³»¾ß ÇÑ´Ù.
¢º ¾Æ·¡´Â ÀÌ·¯ÇÑ ±â´ÉÀ» ó¸®ÇÏ´Â ÇÁ·Î±×·¥ ÄÚµåÀε¥, WM_ ASYNC ¸Þ½ÃÁö¸¦ ¹ß»ý½ÃŲ ¼ÒÄÏÀÌ ¾î¶² ¼ÒÄÏÀÎÁö È®ÀÎÇϱâ À§ÇÏ¿© Àӽà ¼ÒÄϹøÈ£ sock_tmp¸¦ »ç¿ëÇÏ°í ÀÖ´Ù.
SOCKET sock_tmp;
case WM_ASYNC: sock_tmp = LOBYTE(wParam); /* À̺¥Æ®¸¦ ¹ß»ý½ÃŲ ¼ÒÄϹøÈ£ ÃßÃâ */ if(sock_tmp == m_sAccept) { /* »õ·Î¿î Ŭ¶óÀ̾ðÆ®ÀÇ Âü°¡½Åû ó¸® Áï accept() ¼öÇà */ } else { /* m_sClient[] Áß¿¡ ÇØ´ç Ŭ¶óÀ̾ðÆ®ÀÇ Ã¤Æà ¸Þ½ÃÁö ¼ö½Å */ /* äÆà ¸Þ½ÃÁö ¹æ¼Û */ } |
(9) µ¥ÀÌÅÍ ¼Û¼ö½Å
¢º WSAAsyncSelect()¿¡¼ ÁöÁ¤ÇÑ »ç¿ëÀÚ ¸Þ½ÃÁö WM_ ASYNC°¡ ¹ß»ýÇÏ¿´À» ¶§ ¼ÒÄÏ¿¡¼ ¹ß»ýÇÑ À̺¥Æ®ÀÇ ±¸Ã¼ÀûÀÎ ³»¿ëÀÌ lParam ÆĶó¹ÌÅÍ¿¡ µé¾î ÀÖ°Ô µÈ´Ù.
¢º µû¶ó¼ lParamÀÇ °ªÀ» È®ÀÎÇÏ¿© µ¥ÀÌÅÍÀÇ ¼Û½Å ¹× ¼ö½Å µîÀÇ ÀûÀýÇÑ ±â´ÉÀ» ó¸®ÇÏ¸é µÈ´Ù.
¢º ´ÙÀ½¿¡ µ¥ÀÌÅÍ Àбâ, ¾²±â, Á¾·á À̺¥Æ®¸¦ °¢°¢ ó¸®ÇÏ´Â °ÍÀ» º¸ÀÌ°í ÀÖ´Ù.
switch(lParam) {
case FD_READ: /* ÀÐÀ» µ¥ÀÌÅÍ ¹ß»ý */ /* Ŭ¶óÀ̾ðÆ®°¡ º¸³½ µ¥ÀÌÅ͸¦ Àд´٠*/ memset(buf, '\0', 512); recv_len = recv(sock_tmp, buf,
512, 0); /* ¼ÒÄÏ(sock_tmp)¿¡ FD_WRITEÀÇ »ç¿ëÀÚ Á¤ÀÇ ¸Þ½ÃÁö¸¦ ¹ß»ý½ÃŲ´Ù. */ PostMessage(WM_ASYNC, sock_tmp, WSAMAKESELECTREPLY(FD_WRITE,0)); break; case FD_WRITE: /* ¸ðµç äÆà °¡ÀÔÀÚ¿¡°Ô ¸Þ½ÃÁö¸¦ Àü¼ÛÇÑ´Ù */ for(i=0; i<m_Total; i++) send(m_sClient[i], buf, sizeof(buf), 0); break; case FD_CLOSE: /* ÇØ´ç Ŭ¶óÀ̾ðÆ®¸¦ Á¾·á½ÃÅ°°í */ /* Àüü Ŭ¶óÀ̾ðÆ® ¼ö¸¦ Çϳª ÁÙÀδ٠*/ for(i = 0; i < m_Total; i++) { if (sock_tmp == m_sClient[i]) { /* Á¾·á¸¦ ¿øÇÏ´Â ¼ÒÄÏÀÌ */ /* Ŭ¶óÀ̾ðÆ® ¼ÒÄÏ ¹è¿¿¡ ÀÖ´ÂÁö È®ÀÎ */ closesocket(m_sClient[i]); /* ¼ÒÄÏ ¹è¿ÀÇ ºó °÷À» ä¿î´Ù */ if ( i != (m_Total - 1) ) { m_sClient[i] = m_sClient[m_Total-1]; } m_Total--; break; } } } |
¢º wchat_server ÇÁ·Î±×·¥
ÇöÀç°Á : Winsock ÇÁ·Î±×·¡¹Ö ÀÌÀü: 5.2 À©¼ÓÀÇ µ¿ÀÛ ´ÙÀ½: 5.4 À©¼Ó äÆà Ŭ¶óÀ̾ðÆ®