.h 파일에 추가한다.
// 비동기 소켓 변수이다.
// 비동기 소켓 변수이다.
CAsyncSocket* m_pListenSocket;
// 소켓 통신에 필요한 함수를 선언한다.
.cpp 파일에 추가한다.
// 생성자에 추가한다. 헤더파일에 선언한 비동기 소켓을 초기화 한다.
m_pListenSocket = NULL;
// 소멸자 밑에 다가 멤버변수를 추가한다.
// 소켓 통신에 필요한 함수를 선언한다.
void SetListenSocket(CAsyncSocket* pSocket);
virtual void OnClose(int nErrorCode);
virtual void OnReceive(int nErrorCode);
.cpp 파일에 추가한다.
// 생성자에 추가한다. 헤더파일에 선언한 비동기 소켓을 초기화 한다.
m_pListenSocket = NULL;
// 소멸자 밑에 다가 멤버변수를 추가한다.
// CClientSocket member functions
void CClientSocket::SetListenSocket(CAsyncSocket* pSocket)
{
m_pListenSocket = pSocket;
}
/************** 소켓을 종료하는 함수이다.*************/
void CClientSocket::OnClose(int nErrorCode)
{
CSocket::OnClose(nErrorCode);
CListenSocket* pServerSocket = (CListenSocket*)m_pListenSocket;
pServerSocket->CloseClientSocket(this);
} /************
클라이언트 정보를 받아 들여온다.
***********/
void CClientSocket::OnReceive(int nErrorCode)
{
// 메인 화면의 변수를 가져온다. 나중에 메인에 데이타를 출력할 때 사용한다.
CChatServerDlg* pMain = (CChatServerDlg*)AfxGetMainWnd();
// temp 에는 char형 데이타를 받아온도.
// token에는 잘라낸 정보를 받아온다.
// str
CString temp = _T(""); CString token = _T(""); CString str = _T("");
CString arr_temp[10] = {_T("")};
int pos=0; DATA_INDEX = 0; // 초기화를 담당한다.
// 클라이언트 정보를 저장한다.
CString strIPAddress = _T("");
UINT uPortNumber = 0;
CString strTmp = _T(""); // 메인 윈도우에 보여주기 위해서 위한 변수다.
// 데이타를 저장하는 배열이다.
TCHAR szBuffer[1024] = _T("");
// 배열의 시작 주소부터 사이즈 까지 0으로 초기화 시키는 역할을 한다.
::ZeroMemory(szBuffer, sizeof(szBuffer));
// 클라이언트의 주소와 포트 번호를 받아온다.
GetPeerName(strIPAddress, uPortNumber);
// 클라이언트가 보낸 값을 받아온다. // 수신 버퍼주소, 수신 버퍼크기
// 받아온 데이터는 유니코드라서 아스키로 바꿔야 한다.
if(Receive(szBuffer, sizeof(szBuffer)) > 0)
{
temp = UTF8ToANSI(szBuffer); // UTF8 -> ANSI 변환
// token 에 받아온 데이터를 '/' 기준으로 잘라 저장한다.
// arr에 분할된 것 들이 저장된다.
// str 에는 '/'을 제외한 문자열을 저장한다.
while( ( token = temp.Tokenize(_T("/"), pos)) != _T("") ){
arr_temp[DATA_INDEX] = token;
str.Append(arr_temp[DATA_INDEX] + _T("/") );
DATA_INDEX++;
}
str.Delete( (str.GetLength())-1, 1);
DATA_INDEX--; // 마지막에 인덱스가 한번 더 올라가기 때문에 한번 밴다.
// 메시지를 저장한 다음에. 메시지 정보를 알 수 있다.
DATA_INFO = arr_temp[0];
// [ 이 문장으로 종료를 알린다.
// [] 안에는 데이타의 인덱스 값을 넘겨준다.
str.Append(_T("["));
CString str2 = (_T(""));
str2.Format("%d",DATA_INDEX);
str.Append(str2);
str.Append("]");
if( arr_temp[0].Compare( _T("MES_LOGIN") ) == 0 ){
strTmp.Format(_T("[%s:%d] : 받은 데이터 :%s|| 인덱스 : %d -성공!!@!@"),
strIPAddress, uPortNumber, str, DATA_INDEX);
}
else{
strTmp.Format(_T("[%s:%d] : 받은 데이터 :%s|| 인덱스 : %d -실패!!@!@"),
strIPAddress, uPortNumber, str, DATA_INDEX);
}
// 메인 윈도우 리스트에 문자를 추가한다.
pMain->m_List.AddString(strTmp);
pMain->m_List.SetCurSel(pMain->m_List.GetCount() -1);
// ######### 받은 정보를 메시지별로 분류하기 위해 전달한다. ##########
new CDataFilter(DATA_INDEX, arr_temp);
DATA_INDEX = 0; // 인덱스는 전역 변수니 초기화 해준다.
/*
// ######데이타를 바로 전달하지 않고, 메시지를 필터해서 보내야한다.#####
// char 에다가 CString 을 대입하는 방법이다
// 다른 방법들은 나의 블로그를 참조하라.
_tcscpy(szBuffer, str);
// Listen소켓에 멤버 함수를 호출해서 데이터를 전달한다.
// 멤버 함수에 데이타를 저장한 배열을 전달한다.
CListenSocket* pServerSocket = (CListenSocket*)m_pListenSocket;
pServerSocket->SendChatDataAll(this, szBuffer);
*/
// 그리고 나머지 것들은 초기화 하여야 한다.
pos=0;
}
CSocket::OnReceive(nErrorCode);
}