1:1 채팅 프로그램ì�„ 만들 수 있ì�„ ì •ë�„로 발표 준비를 í• ê²ƒ.
----
----
소켓 ì�´í•´í•˜ê¸° ¶
| ì „í™”ê¸° | 소켓 |
| ì „í™”ë¥¼ 받기 위한 'ì „í™” 번호' | IP주소 |
| ì „í™”ì„ ì�´ ì—°ê²°ë�˜ì–´ ì „í™”ë¥¼ ë°›ì�„ 수 있는 ìƒ�태 | 대기ìƒ�태(Listen) |
| ì „í™”ê°€ ê±¸ë ¤ì˜´ | ì—°ê²° ìš”ì²(Connect) |
| ì „í™”ë¥¼ ë°›ì�Œ | ì—°ê²° í—ˆë�½(Accept) |
~cpp
Socket �성 -> Socket � �름연결 (bind)
-> ���언트� 연결� 기다림(listen)
-> ���언트를 받아들임 (Accept)
-> í�´ë�¼ì�´ì–¸íЏì�˜ ëª…ë ¹ì�„ 받아서 ì �ì ˆí•œ 서비스를 수행
~cpp
Socket ìƒ�성 -> 서버ì—� ì—°ê²° 시ë�„(connect) -> 서버ì—� ê°�종 ëª…ë ¹ì�„ ì „ë‹¬
ì˜ˆì œ(서버) ¶
Dialog based -> Windows Sockets를 ì„¤ì •
기초 �래스가 CAsyncSocket� 새로운 �래스 CListenSock, CChildSock� 새로 �성한다.
새로 추가� �개� �래스를 다�과 같� 편집한다.
í�´ëž˜ìŠ¤ìœ„ì €ë“œì�˜ CListenSockì—� ê°€ìƒ� 함수 OnAccept()를 추가한 후 다ì�Œ ë�¼ì�¸ì�„ 삽입한다.
기초 �래스가 CAsyncSocket� 새로운 �래스 CListenSock, CChildSock� 새로 �성한다.
새로 추가� �개� �래스를 다�과 같� 편집한다.
í�´ëž˜ìŠ¤ìœ„ì €ë“œì�˜ CListenSockì—� ê°€ìƒ� 함수 OnAccept()를 추가한 후 다ì�Œ ë�¼ì�¸ì�„ 삽입한다.
~cpp ((CServerApp*)AfxGetApp())->Accept();
í�´ëž˜ìŠ¤ìœ„ì €ë“œì�˜ CChildSockì—� ê°€ìƒ� 함수 OnReceive()와 OnClose()를 추가한 후 다ì�Œ 코드를 삽입한다.
~cpp ((CServerApp*)AfxGetApp())->CloseChild();
~cpp ((CServerApp*)AfxGetApp())->ReceiveData();
어플리케ì�´ì…˜ í�´ëž˜ìФì—� 다ì�Œì�˜ 멤버변수와 함수 ì›�형ì�„ ì„ ì–¸í•œë‹¤.
~cpp #include "ChildSock.h" #include "ListenSock.h"
~cpp void InitServer(); void Accept(); void SendData(CString& strData); void ReceiveData(); void CloseChild(); void CleanUp(); CListenSock* m_pServer; CChildSock* m_pChild;
어플리케�션 �래스� �성��서 추가한 멤버변수를 초기화한다.
~cpp m_pServer = NULL; m_pChild = NULL;
ê·¸ë¦¬ê³ ë‚˜ì„œ 추가한 멤버함수를 다ì�Œê³¼ ê°™ì�´ ì •ì�˜í•œë‹¤.
~cpp
void CServerApp::InitServer()
{
m_pServer = new CListenSock;
m_pServer->Create(7000);
m_pServer->Listen();
}
void CServerApp::Accept()
{
AfxMessageBox("ì ‘ì†� 허용");
m_pChild = new CChildSock;
m_pServer->Accept(*m_pChild);
m_pMainWnd->GetDlgItem(IDC_SEND)->EnableWindow(TRUE);
}
다ì�Œìœ¼ë¡œ ë�°ì�´í„° ì†¡ìˆ˜ì‹ ìž‘ì—…ì�„ 하는 함수를 추가한다. ê·¸ 다ì�Œ, ë�°ì�´í„° ì†¡ìˆ˜ì‹ í›„ 마무리 작업ì�„ 한다.
~cpp
void CServerApp::SendData(CString& strData)
{
m_pChild->Send(LPCSTR(strData), strData.GetLength()+1);
CString strText;
UINT nPort;
m_pChild->GetSockName(strText, nPort);
strText = "[" + strText + "]" + strData;
((CListBox*)m_pMainWnd->GetDlgItem(IDC_LIST1))->InsertString(-1, strText);
}
void CServerApp::ReceiveData()
{
char temp[1000];
m_pChild->Receive(temp, sizeof(temp));
CString strText;
UINT nPort;
m_pChild->GetPeerName(strText, nPort);
strText = "[" + strText + "]" + temp;
((CListBox*)m_pMainWnd->GetDlgItem(IDC_LIST1))->InsertString(-1, strText);
}
void CServerApp::CleanUp()
{
if (m_pChild)
delete m_pChild;
if (m_pServer)
delete m_pServer;
}
void CServerApp::CloseChild()
{
AfxMessageBox("종료");
delete m_pChild;
m_pMainWnd->GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
}
리소스뷰ì—�서 다ì�´ì–¼ë¡œê·¸ í•목ì�˜ "IDD_SERVER_DIALOG"ì�„ 편집한다.
~cpp 리스트박스ID : IDC_LIST1 �디트 컨트롤ID : IDC_DATA 버튼 컨트롤ID : IDC_SEND
다ì�´ì–¼ë¡œê·¸ê°€ 초기화ë� 때 서버로 ìž‘ë�™í•˜ë�„ë¡� CServerDlg í�´ëž˜ìФì�˜ OnInit Dialog()함수ì—� 다ì�Œ 코드를 삽입한다.
~cpp ((CServerApp*)AfxGetApp)->InitServer(); GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
ê·¸ë¦¬ê³ ë‚˜ì„œ í�´ëž˜ìŠ¤ìœ„ì €ë“œì�˜ CServerDlgì—� IDC_SEND를 맵핑한 후 다ì�Œ 코드를 추가한다.
~cpp CString strData; GetDlgItemText(IDC_DATA, strData); ((CServerApp*)AfxGetApp())->SendData(strData); SetDlgItemText(IDC_DATA,"");
ì˜ˆì œ(í�´ë�¼ì�´ì–¸íЏ) ¶
서버와 ë�™ì�¼í•œ 방법으로 í�´ë�¼ì�´ì–¸íЏ 프로그램ì—�서 ì‚¬ìš©í• ì†Œì¼“ í�´ëž˜ìФ CClientSockì�„ ìƒ�성(기초 í�´ëž˜ìФ: CAsyncSocket)한다. ê·¸ë¦¬ê³ ë‚˜ì„œ í�´ëž˜ìŠ¤ìœ„ì €ë“œì�˜ CClientSockì—� ê°€ìƒ�함수 OnReceive()와 OnClose()를 추가한 후, 다ì�Œ 코드를 삽입한다.
~cpp ((CClientApp*)AfxGetApp())->CloseChild();
~cpp ((CClientApp*)AfxGetApp())->ReceiveData();
서버 ì ‘ì†�시 필요한 IP 주소를 ìž…ë ¥ë°›ê¸° 위해 리소스뷰ì—�서 다ì�´ì–¼ë¡œê·¸ë¥¼ 하나 추가한 후 다ì�Œê³¼ ê°™ì�´ 편집한다.
~cpp IP주소 컨트롤ID : IDC_IPADDRESS1 버튼 ID : IDOK, IDCANCLE
í�´ëž˜ìŠ¤ìœ„ì €ë“œë¥¼ 실행하여 CConnectDlg í�´ëž˜ìŠ¤ë¥¼ 새로 ìƒ�성한 후 CConnectDlg í�´ëž˜ìФì—� 다ì�Œ 변수를 추가한다.
~cpp CString m_strAddress;
ê·¸ë¦¬ê³ í�´ëž˜ìŠ¤ìœ„ì €ë“œì�˜ CConnectDlgì—� IDOK를 맵핑하여 사용ìž�ê°€ ìž…ë ¥í•œ IP 주소를 멤버변수 m_strAddressì—� ì €ìž¥í•œë‹¤.
~cpp GetDlgItemText(IDC_IPADDRESS1, m_strAddress);
어플리케ì�´ì…˜ í�´ëž˜ìФì—� 다ì�Œê³¼ ê°™ì�´ 멤버변수와 함수 ì›�형ì�„ ì„ ì–¸í•œë‹¤.
~cpp #include "ClientSock.h"
~cpp void Connect(); void SendData(CString& strData); void ReceiveData(); void CloseChild(); void CleanUp(); CClientSock* m_pClient;어플리케�션 �래스� �성��서 추가한 멤버변수를 초기화한다.
~cpp m_pClient = NULL;
~cpp
#include "ConnectDlg.h"
void CClientApp::Connect()
{
CConnectDlg dlg;
if (dlg.DoModal() == IDOK)
{
m_pClient = new CClientSock;
m_pClient->Create();
m_pClient->Connect(dlg.m_strAddress, 7000);
m_pMainWnd->GetDlgItem(IDC_SEND)->EnableWindow(TRUE);
m_pMainWnd->GetDlgItem(IDC_CONNECT)->EnableWindow(FALSE);
}
}
ì�´ë•Œ 중요한 것ì�€ 서버 프로그램ì�˜ í�¬íЏ 번호(7000)와 ì„¤ì •í• í�¬íЏ 번호가 ì�¼ì¹˜í•´ì•¼ 한다.
ì�´ì™¸ì�˜ ë�°ì�´í„° ì†¡ìˆ˜ì‹ ê³¼ì •ê³¼ 마무리 작업ì�€ 서버 프로그램과 ìœ ì‚¬í•˜ë‹¤.
ì�´ì™¸ì�˜ ë�°ì�´í„° ì†¡ìˆ˜ì‹ ê³¼ì •ê³¼ 마무리 작업ì�€ 서버 프로그램과 ìœ ì‚¬í•˜ë‹¤.
~cpp
void CClientApp::SendData(CString& strData)
{
m_pClient->Send(LPCSTR(strData), strData.GetLength()+1);
CString strText;
UINT nPort;
m_pClient->GetSockName(strText, nPort);
strText = "[" + strText + "]" + strData;
((CListBox*)m_pMainWnd->GetDlgItem(IDC_LIST1))->InsertString(-1, strText);
}
void CClientApp::ReceiveData()
{
char temp[100];
m_pClient->Receive(temp, sizeof(temp));
CString strText;
UINT nPort;
m_pClient->GetPeerName(strText, nPort);
strText = "[" + strText + "]" + temp;
((CListBox*)m_pMainWnd->GetDlgItem(IDC_LIST1))->InsertString(-1, strText);
}
void CClientApp::CleanUp()
{
if (m_pClient)
delete m_pClient;
}
void CClientApp::CloseChild()
{
AfxMessageBox("종료");
m_pMainWnd->GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
}
리소스뷰ì—�서 다ì�´ì–¼ë¡œê·¸ í•목ì�˜ "IDD_CLIENT_DIALOG"ì�„ ë�”블í�´ë¦í•œ 후 다ì�Œê³¼ ê°™ì�´ 편집한다.
~cpp 리스트 ID : IDC_LIST1 �디트 박스ID : IDC_DATA 버튼 ID : IDC_SEND, IDC_CONNECT
~cpp ((CClientApp*)AfxGetApp())->Connect();
~cpp CString strData; GetDlgItemText(IDC_DATA, strData); ((CClientApp*)AfxGetApp())->SendData(strData); SetDlgItemText(IDC_DATA,"");
ì°¸ê³ ¶
http://www.rein.pe.kr/technote/read.cgi?board=programing&y_number=260&nnew=2
http://www.rein.pe.kr/technote/read.cgi?board=programing&y_number=261&nnew=2
http://www.rein.pe.kr/technote/read.cgi?board=programing&y_number=262&nnew=2
http://www.rein.pe.kr/technote/read.cgi?board=programing&y_number=263&nnew=2
http://165.194.17.15/pub/upload/p2pChattingProgram
----
5�용C++스터디
http://www.rein.pe.kr/technote/read.cgi?board=programing&y_number=261&nnew=2
http://www.rein.pe.kr/technote/read.cgi?board=programing&y_number=262&nnew=2
http://www.rein.pe.kr/technote/read.cgi?board=programing&y_number=263&nnew=2
http://165.194.17.15/pub/upload/p2pChattingProgram
----
5�용C++스터디










