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"์์ ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.!!");
}
// ...