《基于winsock的局域网通信系统的开发(共37页)》由会员分享,可在线阅读,更多相关《基于winsock的局域网通信系统的开发(共37页)(37页珍藏版)》请在金锄头文库上搜索。
1、精选优质文档-倾情为你奉上重 庆 理 工 大 学课程设计课程 面向对象程序设计I 题目 基于WinSock的局域 网通信系统的开发 专心-专注-专业1 系统分析 1.1 模块一这个模块的功能是启动登录对话框,并且在启动后有登入,取消,申请帐号三个可以选择,若要登录则输入正确的帐号和密码即可,这是系统将传密码和帐号去验证是否正确,正确的话就可以登入到主对话框来(模块三),不正确的话会有重新输入的提示.如果选择申请帐号则会弹出申请帐号对话框(模块二).另外还可以点击取消(退出)按钮,则程序将关闭.1.2 模块二申请帐号对话框弹出后,用户要输入长度范围内的昵称,以及长度方位内的密码,并且第二次输入的
2、密码要与第一次输入的密码相同,如果不输入点确定也会报错,在确定完输入信息后,点击确定数据库将存放输入的信息,点击取消将回到登录界面.1.3 模块三这个模块中我做的是窗口界面,也就是接口.进入主界面后,可以有更改状态,发送消息,删除好友,查找好友,个人设置,好友消息,退出这几个选项.点击更改状态可以选择自己的状态,一共有三种可供选择,点击查找好友后会弹出一个选择查找方式的窗口,选择方式查到好友后可查看好友资料并加好友,接下来可以与好友聊天,但必须选中好友后再点击发送信息,否则将弹出提示语,这点在点击好友信息按钮和删除好友按钮时也是如此,必须选中后才能操作.另外可以点击个人设置对自己的资料进行填写
3、修改.点击退出会弹出一个确认退出对话框,再次确认后就将退出程序,点取消则返回主对话框.2 系统实现2.1模块一CP2PClientApp theApp;unsigned int CP2PClientApp:_seq_count = 0; /消息号计数器IM_Config_Parser g_fileobj(imclient.ini); /操作配置文件全局对象,配置文件名称imclient.iniMessage_Queue g_rcv_msg_queue;/全局接收消息队列Message_Queue g_send_msg_queue;/全局发送消息队列/全局udp通信对象Udp_Daemon g_
4、udp_daemon;#endif/从配置文件读取配置信息if(!g_fileobj.open()AfxMessageBox(打开配置文件imclient.ini 失败!);return 0;char strValueMAX_STRING_LEN;if(g_fileobj.get_string(im_appclient,im_server_ip,strValue,MAX_STRING_LEN)m_ServerInfo.server_ip = ntohl(inet_addr(strValue);/服务器ipif(g_fileobj.get_string(im_appclient,im_serve
5、r_udp_port,strValue,MAX_STRING_LEN)m_ServerInfo.server_port = atoi(strValue);/服务器端口号if(g_fileobj.get_string(im_appclient,recv_producer_num,strValue,MAX_STRING_LEN)m_ClientInfo.recv_producer_num = atoi(strValue);/接收消息线程数if(g_fileobj.get_string(im_appclient,send_consumer_num,strValue,MAX_STRING_LEN)m_
6、ClientInfo.send_consumer_num = atoi(strValue);/发送消息线程数if(g_fileobj.get_string(im_appclient,process_consumer_num,strValue,MAX_STRING_LEN)m_ClientInfo.process_consumer_num = atoi(strValue);/处理消息线程数if(g_fileobj.get_string(im_appclient,recent_ID,strValue,MAX_STRING_LEN)m_ClientInfo.uid = atoi(strValue);
7、/最近登录的用户帐号m_ClientInfo.client_port = create_client_port(); /获取客户端端口号void CLoginDlg:OnLogin() UpdateData(TRUE);/将界面内容传送给控件成员变量if(m_nUID write_header(header);/构造消息头char szPasswordMAX_PASSWORD_LEN = 0;strcpy(szPassword,m_strPassword.GetBuffer(0);m_strPassword.ReleaseBuffer();send_blk-write_buffer(szPas
8、sword,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.DoMo
9、dal() = IDOK)/弹出注册对话框,如果用户在注册对话框中选择了确定按钮/向服务器发送注册帐号消息IM_Header header;header.cmd = IM_ACCOUNT_REGISTER;header.id = 0;/现在还没有用户号header.seq = CP2PClientApp:create_blk_seq();header.reserved = 0;/开始构造数据包IM_Message_Block* send_blk = new IM_Message_Block;send_blk-write_header(header);/构造消息头char szNickMAX_N
10、ICK_LEN+1 = 0;strcpy(szNick,dlg.m_strNick.GetBuffer(0);dlg.m_strNick.ReleaseBuffer();send_blk-write_buffer(szNick,MAX_NICK_LEN+1);/char szPasswordMAX_PASSWORD_LEN+1 = 0;strcpy(szPassword,dlg.m_strPassword.GetBuffer(0);dlg.m_strPassword.ReleaseBuffer();send_blk-write_buffer(szPassword,MAX_PASSWORD_LE
11、N+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() CDialog:OnCancel(); /调用基类的OnCancel函数,关闭对话框,并返回IDCANCELLRESULT
12、 CLoginDlg:OnAccountRegister(WPARAM wParam, LPARAM lParam)IM_Message_Block* blk = (IM_Message_Block*)lParam;/转化传过来的参数if(!blk)m_nUID = 0;elseUINT32 uid = 0;blk-skip(sizeof(IM_Header);/跳过消息头blk-read_UINT8(&m_ErrorCode);/读取错误码blk-read_UINT32(&uid);/读取注册上的idm_nUID = uid;if(m_ErrorCode=IM_REGISTER_SUCESS & m_nUID!=0)CString strTemp;strTemp.Format(注册新帐号成功,新帐号为:%u,m_nUID);AfxMessageBox(strTemp);else if(m_ErrorCode=IM_REGISTER_ERROR | m_nUID=0)AfxMessageBox(CStr