C++/소켓통신

서버에서 send를 하기 위해서 선언 할 것.

gandus 2011. 6. 3. 18:02
.h 파일에 추가한다.

// 비동기 소켓 변수이다.
CAsyncSocket* m_pListenSocket;


        // 소켓 통신에 필요한 함수를 선언한다.
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);
}