Post List

2014년 12월 25일 목요일

MFC Tcp Server 구현 가이드라인

1. CASyncSocket을 상속받아 CListenSocket 을 생성 

- OnAccept() 를 재정의 함 (필수)

void CListenSocket::OnAccept(int nErrorCode)
{
    CClientSocket* pClient = new CClientSocket;
    if (Accept(*pClient))
    {
        // pClient의 AsyncSocket에 this 등록        // Collection에 pClient 등록    }
    else
    {
        delete pClient;
        // Error 처리    }

    CAsyncSocket::OnAccept(nErrorCode);
}


- CSocket 을 저장 할 Collection 추가 ( List, Hashmap 등... 필요에 따라 구현)

- CloseClient() 구현 : Collection에서 Client 삭제, Client->Shutdown(), Close()

- Client에게 Send()하는 Function 구현 : Collection에서 필요한 Client 찾아서 Send() 호출

2. CSocket을 상속받아 CClientSocket 을 생성

- OnReceive()를 재정의 함 (필수)

void CClientSocket::OnReceive(int nErrorCode)
{
    CString strIPAddress = _T("");
    UINT uPortNumber = 0;
    GetPeerName(strIPAddress, uPortNumber);

    TCHAR szBuffer[1024];
    ::ZeroMemory(szBuffer, sizeof(szBuffer));

    if(Receive(szBuffer, sizeof(szBuffer)) > 0)
    {
        // szBuffer의 내용을 처리 : CAsyncSocket의 Client List의 특정 Client에게 전달         // 바로 Send 할 경우 메세지 가공 후 여기서 바로 Send() 호출 가능    }

    CSocket::OnReceive(nErrorCode);
}

- CAsyncSocket* : ListenSocket을 등록

- OnClose()를 재정의 : 스스로 Shutdown(), Close()하거나, ListenSocket에 자신을 Close 하라고 호출

3. CListenSocket을 생성 후 Server 시작 시점에 Create 하고 Listen

if(m_ListenSocket.Create(Port번호, SOCK_STREAM))
{
    if (!m_ListenSocket.Listen())
    {
        // ERROR: Listen()    }
}
else
{
    // ERRER : Failed to create server socket!}

댓글 없음:

댓글 쓰기