ÇöÀç°­Á : 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 À©¼Ó äÆà Ŭ¶óÀ̾ðÆ®