mfc_NetWork_2 - 8BitsCoding/RobotMentor GitHub Wiki

์ด์ „ CSocket์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•ด๋ณด์ž.

๋ฌธ์ œ๋Š” ํด๋ผ์ด์–ธํŠธ๋ฅผ 2๊ฐœ ์ด์ƒ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์ฃฝ๊ฒŒ๋œ๋‹ค.

MyUser๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๊ด€๋ž˜ํ•ด์•ผํ•œ๋‹ค. -> List ์ž๋ฃŒ๊ตฌ์กฐ์‚ฌ์šฉ

// MyServer
pirvate:
    //CPtrList;
    CObList m_user_list;
    // ๋‘ ๊ฐ€์ง€ List ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ์žˆ๊ณ 
    // CPtrList - CObject๋ฅผ ์ƒ์†ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ
    // CObList - CObject๋ฅผ ์ƒ์†ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ
// OnAccept
MyUser * p_user = new MyUser;
m_user_list.AddTail(p_user);

Accept(*p_user);

// ...

์†Œ๋ฉธ์ž์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ˜ํ™˜

// MyServer::~MyServer
MyUSer *p;
POSITON pos = m_user_list.GetHeadPosition();
while(pos != NULL) {
    p = (MyUser *)m_user_list.GetNext(pos);
    delete p;
}
// MyUser.h
private:
    CObList* mp_user_list;
public:
    MyUser(CObList * ap_user_list);
// MyUser.cpp
MyUser(CObList * ap_user_list)
{
    mp_user_list = ap_user_list;
}

// MyUser::OnClose

ShutDown(2);
Close();

MyUser *p = NULL;
POSITION pos = mp_user_list->GetHeadPosition(), check_pos;
while(pos != NULL) {
    check_pos = pos;
    p = (MyUser*)mp_user_list->GetNext(pos);
    if(p == this) {
        mp_user_list->RemoveAt(check_pos);
        break;
    }
}

if (p != NULL) delete p;

Server์—์„œ Client๊ฐ€ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€๋ฅผ ListBox์— ์ถ”๊ฐ€ํ•˜๋„๋ก ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์ž

// Dlg.h
void AddEventString(const wchar_t * ap_string)
{
    int index = m_evnet_list.InsertString(-1, ap_string);
    m_event_list.SetCurSel(index);
}

private:
    CListBox m_evnet_list;
// MyUser::OnReceive
int value;
Receive(&value, sizeof(int));

CString str;
str.Format(L"%d", value);

((Dlg*)AfxGetMainWnd())->AddEventString(str);

value = 1;
Send(&value, sizeof(int));

// ...

๋ฌธ์ž์—ด์„ ์†ก/์ˆ˜์‹ ํ•˜๊ฒŒ ํ•ด๋ณด์ž.

// ClientDlg ์†ก์‹  ๋ฒ„ํŠผ
CString str;
GetDlgItemText(IDC_VALUE_EDIT, str);
unsigned int data_size = (str.GetLength()+1) * 2;
char * p_send_data = new char[sizeof(unsigned int) + data_size];
*(unsigned int*)p_send_data = data_size;
memcpy(p_send_data + sizeof(unsigned int), str.GetBuffer(), data_size);

m_client.Send(p_send_data, sizeof(unsigned int) + data_size);

delete[] p_send_data;
// Server
// MyUser.h
private:
    CObList * mp_user_list;
    char m_is_header = 1;
    unsigned int m_data_size;
// Server
// MyUser::OnReceive

DWORD temp_size;
if(IOCtl(FIONREAD, &temp_size)) {
    // ์ˆ˜์‹  ๋ฒ„ํผ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋“ค์–ด์™€์žˆ๋Š”์ง€ ํ™•์ธ
    if(m_is_header) {
        if(temp_size >= sizeof(unsigned_int)) {
            Receive(&m_data_size, sizeof(unsigend int));
            m_is_header != m_is_header;
        }
    }
    else {
        if(temp_size >= m_data_size) {
            char * p_string = new char[m_data_size];
            Receive(p_string, m_data_size);

            ((Dlg*)AfxGetMainWnd())->AddEventString((wchar_t*)p_string);

            delete[] p_string;
            m_is_header != m_is_header;
        }
    }
} else {
    ((Dlg*)AfxGetMainWnd())->AddEventString(L"์ˆ˜์‹ ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.!!");
}

// ...