~cpp
((CClientApp*)AfxGetApp())->CloseChild();
~cpp
((CClientApp*)AfxGetApp())->ReceiveData();
서버 접속시 필요한 IP 주소를 입력받기 위해
리소스뷰에서 다이얼로그를 하나 추가한 후 다음과 같이 편집한다.
~cpp
IP주소 컨트롤ID : IDC_IPADDRESS1
버튼 ID : IDOK, IDCANCLE
~cpp
CString 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,"");