¿¹Á¦ 8 º¯Çü) 1´ë1 äÆÃ ÇÁ·Î±×·¥ - ¸â¹ö º¯¼ö publicÀ¸·Î ¼­¹ö ÇÁ·Î±×·¥ ÇÁ·ÎÁ§Æ® »ý¼º : Step4 Windows Sockets ¼³Á¤, Step6 Base Class - Form View¼³Á¤ 1) µðÀÚÀÎ a. Menu Á¢¼Ó -> ´ë±â : ID_LISTEN (ÆÄÀÏ ¸Þ´º ´ë½Å) Á¾·á b. Form View Dialog ¹Þ´Â ¸» Editor : IDC_RECEIVE (Styles Tab : "Read Only"¼³Á¤) º¸³»´Â ¸» Editor : IDC_SEND º¸³»±â Button : IDC_BUTTON_SEND 2) Ŭ·¡½º Ãß°¡ ( CAsyncSocket»ó¼Ó ) CServerŬ·¡½º CChildServerŬ·¡½º 3) Çڵ鷯 ÇÔ¼ö, °»½Å Çڵ鷯 ÇÔ¼ö ¹× ValueÇü ¸â¹ö º¯¼ö Ãß°¡ a. ¸Þ´º (Form View Ŭ·¡½º¿¡) ID_LISTEN OnListen() OnUpdateListen() b. Æûºä (Form View Ŭ·¡½º¿¡) IDC_BUTTON_SEND OnButtonSend() (ÅëÁö ¸Þ¼¼Áö BN_CLICKED¿¡ ´ëÇÑ Çڵ鷯ÇÔ¼ö) IDC_RECEIVE CString m_strReceive Max : 200 IDC_SEND CString m_strSend Max : 200 4) CServerŬ·¡½º¿¡ ¸â¹ö º¯¼ö, ¸â¹ö ÇÔ¼ö µî Ãß°¡ -¸â¹öº¯¼ö (publicÀ¸·Î) HWND m_pHwnd CChildServer m_pChild -°¡»ó(Virtual)ÇÔ¼ö OnAccept()Ãß°¡ -Çì´õÆÄÀÏ¿¡ #define WM_ACCEPT_SOCKET WM_USER+1 #include "ChildServer.h" 5) CChildServerŬ·¡½º¿¡ ¸â¹ö º¯¼ö, ¸â¹ö ÇÔ¼ö µî Ãß°¡ -¸â¹öº¯¼ö (publicÀ¸·Î) HWND m_pHwnd -°¡»ó(Virtual)ÇÔ¼ö OnReceive()Ãß°¡ -Çì´õÆÄÀÏ¿¡ #define WM_RECEIVE_DATA WM_USER+2 6) ~ViewŬ·¡½º¿¡ ¸â¹öº¯¼ö ¹× »ç¿ëÀÚ ¸Þ¼¼Áö µî Ãß°¡ -¸â¹öº¯¼ö (publicÀ¸·Î) CChildServer* m_pChildServer CServer* m_pServer -»ç¿ëÀÚ ¸Þ½ÃÁö ÇÔ¼ö Ãß°¡ a. ¸â¹ö ÇÔ¼ö »ðÀÔ°ú °°Àº ¹æ¹ý (Protected·Î) afx_msg void OnReceive(UINT wParam, LONG lParam); afx_msg void OnAccept(UINT wParam, LONG lParam); b. MESSAGE MAP¿¡ ´ÙÀ½ 2ÁÙ »ðÀÔ. (~ViewÀÇ CPPÆÄÀÏ¿¡) BEGIN_MESSAGE_MAP(CChatView, CFormView) //{{AFX_MSG_MAP(CChatView) ON_MESSAGE(WM_ACCEPT_SOCKET, OnAccept) ON_MESSAGE(WM_RECEIVE_DATA, OnReceive) //}}AFX_MSG_MAP END_MESSAGE_MAP() -Çì´õ ÆÄÀÏ¿¡ #include "Server.h" Ãß°¡ 7) CServerŬ·¡½º ±¸Çö ( ÄÚµå Ãß°¡ ) -°¡»ó(Virtual)ÇÔ¼ö //Ŭ¶óÀÌ¾ðÆ®¿¡¼­¿Â Connect Event¿¡ ÀÇÇÑ VirtualÇÔ¼ö void CServer::OnAccept(int nErrorCode) { //Ŭ¶óÀÌ¾ðÆ® ¼ÒÄÏÀÌ Á¢¼ÓÇÏ°Ô ÇØ´Þ¶ó´Â ¿äûÀ» Çã¶ôÇÏ´Â °úÁ¤. //m_pChild °´Ã¼¸¦ Ŭ¶óÀÌ¾ðÆ® ¼ÒÄϰú ¿¬°á. Accept(m_pChild); //ChildServer¸¦ »ý¼ºÇϰí Åë½ÅÇϱâÀ§ÇØ ~ViewŬ·¡½ºÀÇ OnAccept¿¡ ¸Þ½ÃÁö Àü´Þ. SendMessage(m_pHwnd, WM_ACCEPT_SOCKET, 0, 0); } 8) CChildServerŬ·¡½º ±¸Çö ( ÄÚµå Ãß°¡ ) -°¡»ó(Virtual)ÇÔ¼ö void CChildServer::OnReceive(int nErrorCode) { SendMessage(m_pHwnd, WM_RECEIVE_DATA, 0, 0); } 9) ~ViewŬ·¡½º ±¸Çö ( ÄÚµå Ãß°¡ : ~ViewÀÇ CPPÆÄÀÏ¿¡) -»ý¼ºÀÚ ÇÔ¼ö m_pServer = NULL; m_pChildServer = NULL; -»ç¿ëÀÚ ¸Þ½ÃÁö ÇÔ¼ö void CChatView::OnAccept(UINT wParam, LONG lParam) { m_pChildServer = new CChildServer; //¼­¹ö ¼ÒÄÏÀ¸·Î ºÎÅÍ ÇöÀç ¿¬°áµÈ ¼ÒÄÏÀ» ¹Þ´Â´Ù. m_pChildServer = &(m_pServer->m_pChild); m_pChildServer->m_pHwnd = m_hWnd; char temp[200]; sprintf(temp, "¾È³ç!"); m_pChildServer->Send(temp, 200); } void CChatView::OnReceive(UINT wParam, LONG lParam) { char temp[200]; m_pChildServer->Receive(temp, 200); m_strReceive=temp; UpdateData(FALSE); } -Çڵ鷯 ÇÔ¼ö void CChatView::OnButtonSend() { if(!m_pChildServer) { AfxMessageBox("Á¢¼ÓµÈ »ç¿ëÀÚ°¡ ¾øÀ½"); return; } UpdateData(TRUE); char temp[200]; sprintf(temp,LPCTSTR(m_strSend)); m_pChildServer->Send(temp, 200); } void CChatView::OnListen() { m_pServer = new CServer; //ÇöÁ¦ÀÇ View·Î "¸Þ½ÃÁö"°¡ Àü´ÞµÇµµ·Ï m_pServer->m_pHwnd = m_hWnd; if(!m_pServer->Create(2000)) { delete m_pServer; m_pServer = NULL; AfxMessageBox("¼­¹ö ¼ÒÄÏ »ý¼º ½ÇÆÐ"); return; } if(!m_pServer->Listen()) { delete m_pServer; m_pServer = NULL; AfxMessageBox("¼­¹ö ´ë±â ½ÇÆÐ"); } } void CChatView::OnUpdateListen(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_pServer); } 2. Ŭ¶óÀÌ¾ðÆ® ÇÁ·ÎÁ§Æ® »ý¼º : Step4 Windows Sockets ¼³Á¤, Step6 Base Class - Form View¼³Á¤ 1) µðÀÚÀÎ (Design) a. Menu Á¢¼Ó -> ¼­¹öÁ¢¼Ó : ID_CONNECT (ÆÄÀÏ ¸Þ´º ´ë½Å) Á¢¼ÓÇØÁ¦ : ID_DISCONNECT Á¾·á b. Form View Dialog ¹Þ´Â ¸» Editor : IDC_RECEIVE (Styles Tab : "Read Only"¼³Á¤) º¸³»´Â ¸» Editor : IDC_SEND º¸³»±â Button : IDC_BUTTON_SEND c. IP Dialog ( Ŭ·¡½º¸í CSetIp ) IP Editor : IDC_IP 2) Ŭ·¡½º Ãß°¡ CClientŬ·¡½º ( CAsyncSocket »ó¼Ó ) 3) Çڵ鷯 ÇÔ¼ö, °»½Å Çڵ鷯 ÇÔ¼ö ¹× ValueÇü ¸â¹ö º¯¼ö Ãß°¡ a. Menu (Form View Ŭ·¡½º¿¡) ID_CONNECT OnConnect OnUpdateConnect ID_DISCONNECT OnDisconnect OnUpdateDisconnect b. Form View Dialog (Form View Ŭ·¡½º¿¡) IDC_BUTTON_SEND OnButtonSend (ÅëÁö ¸Þ¼¼Áö BN_CLICKED¿¡ ´ëÇÑ Çڵ鷯ÇÔ¼ö) IDC_RECEIVE CString m_strReceive Max : 200 IDC_SEND CString m_strSend Max : 200 c. IP Dialog (Dialog Ŭ·¡½º¿¡) IDC_IP CString m_strIp Max : 80 4) CClientŬ·¡½º¿¡ ¸â¹ö º¯¼ö, ¸â¹ö ÇÔ¼ö µî Ãß°¡ -¸â¹öº¯¼ö (publicÀ¸·Î) HWND m_pHwnd -°¡»ó(Virtual)ÇÔ¼ö OnReceive()Ãß°¡ -Çì´õÆÄÀÏ¿¡ #define WM_RECEIVE_DATA WM_USER+2 5) ~ViewŬ·¡½º¿¡ ¸â¹öº¯¼ö ¹× »ç¿ëÀÚ ¸Þ½ÃÁö Ãß°¡ -¸â¹öº¯¼ö (publicÀ¸·Î) CClient* m_pClient BOOL m_bConnect -»ç¿ëÀÚ ¸Þ½ÃÁö ÇÔ¼ö Ãß°¡ a. ¸â¹ö ÇÔ¼ö »ðÀÔ°ú °°Àº ¹æ¹ý (protected·Î) afx_msg void OnReceive(UINT wParam, LONG lParam); b. MESSAGE MAP¿¡ ´ÙÀ½ 1ÁÙ »ðÀÔ. (~ViewÀÇ CPPÆÄÀÏ¿¡) BEGIN_MESSAGE_MAP(CChatView, CFormView) //{{AFX_MSG_MAP(CChatView) ON_MESSAGE(WM_RECEIVE_DATA, OnReceive) //}}AFX_MSG_MAP END_MESSAGE_MAP() -Çì´õÆÄÀÏ¿¡ #include "Client.h" Ãß°¡ 6) CClientŬ·¡½º ±¸Çö ( ÄÚµå Ãß°¡ ) -°¡»ó(Virtual)ÇÔ¼ö void CClient::OnReceive(int nErrorCode) { SendMessage(m_pHwnd, WM_RECEIVE_DATA, 0, 0); } 7) ~ViewŬ·¡½º ±¸Çö ( ÄÚµåÃß°¡ ) -CPPÆÄÀÏ¿¡ #include "SetIp.h" Ãß°¡ -»ý¼ºÀÚ ÇÔ¼ö¿¡ m_bConnect = FALSE; -Çڵ鷯 ÇÔ¼ö void CClientchatView::OnConnect() { m_pClient = new CClient; CSetIp *pDlg = new CSetIp; if(pDlg->DoModal()==IDOK){ char temp[80]; sprintf(temp, LPCTSTR(pDlg->m_strIp)); if(!m_pClient->Create()) { delete m_pClient; m_pClient =NULL; AfxMessageBox("¼ÒÄÏ »ý¼º ½ÇÆÐ"); } m_pClient->Connect(temp, 2000); m_pClient->m_pHwnd = m_hWnd; m_bConnect = TRUE; } } void CClientchatView::OnUpdateConnect(CCmdUI* pCmdUI) { pCmdUI->Enable(!m_bConnect); } void CClientchatView::OnButtonSend() { if(m_bConnect==TRUE){ UpdateData(TRUE); char temp[200]; sprintf(temp, LPCTSTR(m_strSend)); m_pClient->Send(temp,200); } else{ AfxMessageBox("¼­¹ö Á¢¼ÓºÎÅÍ Çϼ¼¿ä!"); } } void CClientchatView::OnDisconnect() { m_pClient->ShutDown(); m_pClient->Close(); if(m_pClient != NULL) { delete m_pClient; m_pClient = NULL; } m_bConnect=FALSE; } void CClientchatView::OnUpdateDisconnect(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here pCmdUI->Enable(m_bConnect); } -»ç¿ëÀÚ ¸Þ½ÃÁö ÇÔ¼ö void CClientchatView::OnReceive(UINT wParam, LONG lParam) { char temp[200]; m_pClient->Receive(temp, 200); m_strReceive = temp; UpdateData(FALSE); }