重庆理工大学课程设计
N))
if(g_fileobj.get_string(\
m_ServerInfo.server_port = atoi(strValue);//服务器端口号
ING_LEN))
if(g_fileobj.get_string(\
m_ClientInfo.recv_producer_num = atoi(strValue);//接收消息线程数
ING_LEN))
if(g_fileobj.get_string(\
m_ClientInfo.send_consumer_num = atoi(strValue);//发送消息线程数
RING_LEN))
if(g_fileobj.get_string(\
m_ClientInfo.process_consumer_num = atoi(strValue);//处理消息线程数
STRING_LEN))
if(g_fileobj.get_string(\
m_ClientInfo.uid = atoi(strValue);//最近登录的用户帐号
m_ClientInfo.client_port = create_client_port(); //获取客户端端口号
void CLoginDlg::OnLogin() {
UpdateData(TRUE);//将界面内容传送给控件成员变量 if(m_nUID < 9999)//用户帐号10000从开始 { }
if(m_strPassword.IsEmpty())//密码不能为空 {
AfxMessageBox(CString(\请输入密码!\
6
AfxMessageBox(CString(\请正确输入用户帐号!\GotoDlgCtrl((CWnd*)GetDlgItem(IDC_UID)); return;
重庆理工大学课程设计
}
}
GotoDlgCtrl((CWnd*)GetDlgItem(IDC_PASSWORD)); return;
//开始向服务器发送登录信息,然后根据服务器的返回信息 //判断输入的用户名和密码是否正确 IM_Header header;
header.cmd = IM_SESSION_LOGIN; header.id = m_nUID;
header.seq = CP2PClientApp::create_blk_seq(); header.reserved = 0; //开始构造数据包
IM_Message_Block* send_blk = new IM_Message_Block; send_blk->write_header(header);//构造消息头 char szPassword[MAX_PASSWORD_LEN] = \strcpy(szPassword,m_strPassword.GetBuffer(0)); m_strPassword.ReleaseBuffer();
send_blk->write_buffer(szPassword,MAX_PASSWORD_LEN+1);
send_blk->src_ip_ = theApp.m_ServerInfo.server_ip;//填充该消息的目的地 send_blk->src_port_ = theApp.m_ServerInfo.server_port; send_blk->length_ = send_blk->get_cursor();//填充消息长度 g_send_msg_queue.push_msg(send_blk);//将消息放入发送消息队列
void CLoginDlg::OnApplyUid() {
CRegisterDlg dlg;//定义注册对话框对象
if(dlg.DoModal() == IDOK)//弹出注册对话框,如果用户在注册对话框中选择{
//向服务器发送注册帐号消息 IM_Header header;
header.cmd = IM_ACCOUNT_REGISTER; header.id = 0;//现在还没有用户号
header.seq = CP2PClientApp::create_blk_seq();
了\确定\按钮
7
重庆理工大学课程设计
}
}
header.reserved = 0; //开始构造数据包
IM_Message_Block* send_blk = new IM_Message_Block; send_blk->write_header(header);//构造消息头 char szNick[MAX_NICK_LEN+1] = \strcpy(szNick,dlg.m_strNick.GetBuffer(0)); dlg.m_strNick.ReleaseBuffer();
send_blk->write_buffer(szNick,MAX_NICK_LEN+1);// char szPassword[MAX_PASSWORD_LEN+1] = \strcpy(szPassword,dlg.m_strPassword.GetBuffer(0)); dlg.m_strPassword.ReleaseBuffer();
send_blk->write_buffer(szPassword,MAX_PASSWORD_LEN+1);
send_blk->src_ip_ = theApp.m_ServerInfo.server_ip;//填充该消息的目的地 send_blk->src_port_ = theApp.m_ServerInfo.server_port; send_blk->length_ = send_blk->get_cursor();//填充消息长度 g_send_msg_queue.push_msg(send_blk);//将消息放入发送消息队列
void CLoginDlg::OnCancel() { }
LRESULT CLoginDlg::OnAccountRegister(WPARAM wParam, LPARAM lParam) {
IM_Message_Block* blk = (IM_Message_Block*)lParam;//转化传过来的参数 if(!blk) {
UINT32 uid = 0;
blk->skip(sizeof(IM_Header));//跳过消息头 m_nUID = 0; else
CDialog::OnCancel(); //调用基类的OnCancel函数,关闭对话框,并返回IDCANCEL
8
重庆理工大学课程设计
}
}
blk->read_UINT8(&m_ErrorCode);//读取错误码 blk->read_UINT32(&uid);//读取注册上的id m_nUID = uid;
if(m_ErrorCode==IM_REGISTER_SUCESS && m_nUID!=0) { }
else if(m_ErrorCode==IM_REGISTER_ERROR || m_nUID==0) { }
else if(m_ErrorCode == IM_REGISTER_ERROR_DB) { } delete blk;
AfxMessageBox(CString(\注册帐号失败--数据库错误!\AfxMessageBox(CString(\注册新帐号失败!\CString strTemp;
strTemp.Format(\注册新帐号成功,新帐号为:%u\AfxMessageBox(strTemp);
UpdateData(FALSE);//将成员变量值传给界面
GotoDlgCtrl((CWnd*)GetDlgItem(IDC_UID));//将输入焦点定位到id输入框 return 1;
LRESULT CLoginDlg::OnSessionLogin(WPARAM wParam, LPARAM lParam) {
IM_Message_Block* blk = (IM_Message_Block*)lParam;//转化传过来的参数 if(blk) {
blk->skip(sizeof(IM_Header));//跳过消息头 blk->read_UINT8(&m_ErrorCode);//读取错误码 if(m_ErrorCode == IM_LOGIN_ERROR_PSW) {
AfxMessageBox(CString(\密码错误!\
9
重庆理工大学课程设计
}
}
}
GotoDlgCtrl((CWnd*)GetDlgItem(IDC_PASSWORD)); return 0;
else if(m_ErrorCode == IM_LOGIN_ERROR_UID_UNVALID) { }
else if(m_ErrorCode == IM_LOGIN_ERROR_DB) { }
else if(m_ErrorCode == IM_LOGIN_SUCCESS) { }
theApp.m_ClientInfo.uid = m_nUID;
OnOK();//如果登录成功则调用基类的OnOK函数关闭对话框,并返AfxMessageBox(CString(\数据库错误,登录失败!\GotoDlgCtrl((CWnd*)GetDlgItem(IDC_UID)); return 0;
AfxMessageBox(CString(\该用户帐号不存在!\GotoDlgCtrl((CWnd*)GetDlgItem(IDC_UID)); return 0;
回IDOK
return 1;
2.2模块二
void CRegisterDlg::OnOK() {
UpdateData(TRUE); //从界面向控件变量传送数据 if(m_strNick.IsEmpty()) //昵称不能为空 {
AfxMessageBox(CString(\请输入昵称!\提醒用户 GotoDlgCtrl((CWnd*)GetDlgItem(IDC_NICK)); //定位输入焦点
10