VC++聊天室的实现
1. 流程。
a. 实现软件,Visual C++ 6.0.
使用CSocket实现消息的传递。
ClientDlg ServerDlg
Before send loading infor ,Connection!and do nothing before receive success infor.
Connection Request ImformationSend(LoadInformation name+psw)OnReceive();
CptrList.AddTail(ClientSocket);//创建连接
Bool Isexist();
SuccessInfor;
FailInfro
DeleteConnectiong
1.OnReceive();
a.Analyse information’s type;
b.Include all TYPE information Handle.
2.SendMessage();
A.BuildDifferent msg;
problem:
1. 本打算用 CSocketFile 和 CArchive 来传递消息,用这两个对象几可以实现传递对象的可能。但是由于在实现过程中,接受方的BUFFER中无消息,一直没检查出错误。所以更改了传递消息的方式。
直接传递CString 对象,再在这个里面来构造消息机制。
LOAD MSG:SYSTEMMSG_LOAD_NAME_PASSWORD.
SUCCESSLOAD: SUCCESS_CALLNAME(it’s user’s net name)
SB online:SYSTEMMSG:CALLNAME +“进入了聊天室”;
All online user’s name:USERSNAME_CALLNAME1_CALLNAME2_......
Chatmsg: NOMALMSG_WHO_TOWHO_MSGITEM;
(WHO:who send TOWHO:send to who MSGITEM:what “who ” said)
USERLEFT MSG: "SYSTEMMSG_CLOSE_"+this->m_userInforDlg->m_userName+"_" ;
2.如果用这种方式传递消息有一个风险,假如聊天消息是与“SYSTEMMSG _开头的怎么办?”,如果知道这种消息体制后完全有可能通过传递消息就可以控制你服务器。
解决方案:使用 CSocketFile 序列化后再传递。
Construction MSG half-baked Code :
CString CServerDlg::BuildUserListMsg()
{
CString a;
a="USERLIST";
for(int i=0;i<m_listUser.GetCount();i++) //Include all user’s call name!
{
CString b;
m_listUser.GetText(i,b);
a=a+"_"+b;
}
return a;
}
CString CClientDlg::BuildNomalMsg(CString& preString)// CHATTING MSG
{
CString a;
a="NOMALMSG_"+m_userInforDlg->m_userName+"_"+this->m_comboWho+"_"+preString;
return a;
}
CString CClientDlg::BulidLoadMsg() //load msg
{
CString a;
a="SYSTEMMSG_LOAD_"+m_userInforDlg->m_userName+"_"+m_loadDlg->m_password;
return a;
}
CString CClientDlg::BulidChangeMsg()
{
CString a;
a="SYSTEMMSG_CHANGE_"+m_nameCopy+"_"+this->m_userInforDlg->m_userName;
return a;
}
CString CClientDlg::BulidCancelMsg()
{
CString a="SYSTEMMSG_CLOSE_"+this->m_userInforDlg->m_userName+"_";918