已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
存档编号 基于VC局域网聊天工具的设计与开发 教学学院 数学与计算机科学学院 届 别 2013届 专 业 计算机科学与技术 学 号 姓 名 指导教师 完成日期 2013.05.03 目录内容摘要:1关键词:1Abstract:2Key words:21. 引言31.1 MFC简介31.2 Winsock 介绍32. 需求分析42.1 功能需求分析 42.2 性能需求分析52.3 运行需求分析63. 系统总体设计63.1 设计的目标和意义63.2 系统模块划分74. 详细设计8 4.1 用户注册模块84.2 用户登录模块84.4信息显示模块94.5开启服务器模块94.6连接服务器模块105. 编码实现115.1用户注册模块115.2 用户登录模块155.3 注册信息显示模块165.4 发送信息显示模块205.5 开启服务器模块205.6连接服务器模块246. 总结27参考文献28 内容摘要:本毕业设计采用C+作为前端的应用开发工具,Access作为后台的数据库,采用客户端/服务器(C/S)的模型构建,结构健壮灵活,在数据处理、人机界面、数据通信、系统维护等方面具有功能全面、实用等特点。包括服务器端和客户端两个模块,客户端通过服务器端进行通信。该软件采用多线程技术支持多用户操作,并采用相关技术进行了优化,加快了文字传递速度。 此次开发是在windows7环境下,使用vs2010作为编程工具和编译环境。主要采用MFC类进行构造需要的主要界面框架,客户端和服务端主要是基于TCP协议下的标准通信,能够实现安全快速可靠的信息传输和文件传送功能 。本课题设计出来的局域网聊天工具主要是针对校内用户师生使用,该工具可以通过开始群聊天室来实现师生之间,学生之间的交流沟通,由于采用多线程设计使得了软件可以支持多用户在线聊天,同时,将客户端和服务端集合在一个模块上,使用将更加方便。基于校内局域网可以是师生免费进行即时交流,通过多线程和队列以及异步IO模型实现一个服务端顺利的接收多个客户端的连接,提高了软件的实用性能。关键词:vs2010 MFC 多线程 Abstract: This tool for chatting will be developed by MSVC, database will be set up by Access, construct with model C/S, it is comprehensive and practical from data preceding, User Interface, data channel and system maintenance because of the robust and flexible structure.This tool has two modules: Server and Client, Client transmit messages through Sever. It uses multi-thread technology to transmit faster and it can provide multi-user service.The tool for chatting is development windows7 environment, use VS2010 as programming tools and build environment. MFC class structure needs interface framework, the client and server is based on standard communication under the TCP protocol, able to achieve a safe, fast and reliable transmission of information and file transfer functions. LAN chat tool design of this project is mainly used for the user teachers and students in schools, the tool can start a group chat rooms between teachers and students, the communication between the students, the use of multi-threaded design makes the software can support multipleusers online chat at the same time, the collection of client and server in a module, will be more convenient to use.Based on the the campus LAN can be free real-time exchange of teachers and students through multi-threading and queues, as well as asynchronous IO model to achieve a client successfully receives multiple client connections, to improve the practical performance of the software.Key words: vs2010 MFC Mulitithread 1. 引言本课题主要研究的是基于VC开发的局域网聊天工具,之所以选择这一课题是因为随着时代的进步网络聊天对安全及效率要求越来越高,而局域网聊天工具这类即时聊天工具正符合时代的发展要求;另一方面是因为自己对VC开发比较熟悉,接触的相对较多。本次开发使用的开发工具是vs2010,相对VC6.0它更符合c+标准,而且现在的软件开发也更偏向于可视化设计、人性化使用、安全可靠的vs2010开发平台。开发技术采用的是基于Socket的方法实现网络通信,文件传输等功能,基于Socket的局域网通信软件可以为企业或单位原有的局域网提供一种良好、安全、快速的通信机制。它的实现无需对原有局域网硬件进行任何改动,具有实现成本低廉的优点,而且能有效降低局域网 通信的负荷,提高局域网的使用效率,可以很好的解决各种通信需求。1.1 MFC简介MFC全名是Microsft Foundation Classes,是著名的微软公司提供的一个基础类库。它以C+的形式封装了很多Windows的API函数,而且包含了程序应用框架,所以当我们需要设计一些基础的界面,如对话框、单文档、按钮等等都可以使用其提供的基础API函数来创建。在vs2010的平台上,MFC封装的更加具体,使用者可以按需要按步骤去选择需要创建的框架,可以直接拖控件来生成一个需要的按钮等工具,使用起来相当的方便。1.2 Winsock 介绍Winsock是Windows下的网络编程接口,它是由Unix下的BSD Socket发展而来,是一个与网络协议无关的编程接口。简单说就是可以用于两台或多台机器间通信,它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。使用该接口可以很方便的套用其编程步骤去实现客户端和服务端之间的通信,而且实现的代码简单易懂易于上手和修改。 2. 需求分析2.1 功能需求分析 根据网上现有的相同类型的聊天工具,分析其应有的基本功能需求,结合自己的设计目标及意义,分析我们设计出什么样的功能才能达到所要的目标软件,以及何种创新功能才可与现有的同类型软件不同。同时根据自己目前的能力,分析自己能够实现什么样的功能需求,太复杂太困难的功能可能需要但能力的限制就无法进行设计。由此对课题进行功能需求进行分析可得如图2-1所示功能需求:图2-1 功能需求示意图(1) 用户注册:新用户可以通过界面上的注册按钮进行注册,在通过输入各种注册信息并且输入正确无重复就可注册成功,否则重新输入;(2) 用户登录:已经注册过的用户可以通过用户名和密码登录聊天工具,如果登录信息正确则正常进入,如何错误则弹出错误提示,如果用户名已经注册过则允许重新输入密码,如果未注册,则提示用户注册;(3) 显示在线用户:每个登录在线的用户都会在显示用户列表中;(4) 显示用户注册信息:对已经注册成功的用户可以查询并显示其注册的相关信息,如注册者的学号、姓名、性别、年龄、班级等信息。(5) 发送消息:成功登录聊天工具的人可以选择进入特定的聊天室,在聊天室中发送文本消息;(6) 显示消息:将每个在聊天室即时信息以“用户名+消息内容”的方式显示出来。2.2 性能需求分析(1) 可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。(2)宜操作性,程序简单易懂,容易上手使用。设计界面是,简化界面的复杂性,模拟QQ等现有即时通讯工具的界面,使用户能很容易看懂并使用。(3)软件可以支持一定大数量的在线用户操作而不会发生软件崩溃的现象。(4)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。2.3 运行需求分析(1)用户界面程序较小,启动速度快,无启动界面。在本地局域网中使用,无需认证界面,启动后的应用界面要清爽,设计要简单明了,要具有较高的易用性。(2)故障处理在遇到可预知的故障与情况时,能提示用户并自动退出;在遇到不可预知的故障时能安全退出。(3) 运行性能可以支持多用户交流而不会出现消息过久延迟接收,工具使用不流畅,甚至系统工具无法工作的现象等。3. 系统总体设计3.1 设计的目标和意义本次设计的局域网聊天工具主要是实现以校园为单位的信息交互,由于现在多数大学已经覆盖了自己的校园网,这样在校师生就可以直接连接免费的校园局域网后通过局域网聊天工具进行联系。该系统使用成员主要划分成这几类:院领导、年级主任、班主任、学生。聊天室服务器的开启只用由划分各类中的成员中指定的人员才能开启,职位越高可以开启越多类型的服务器,例如,校领导可以开启院领导的聊天室,也可以开启一个年级或者一个班级的聊天室。而职位低的不可以开启比其职位高的类型聊天室,所以作为学生不能开启任何聊天室,只能进入由其上层已经开启的聊天室中进行发送消息。通过这种设计可以有效的实现在校师生的免费快速的信息交互,也可以有效的管制消息滥发。3.2 系统模块划分 根据网上现有的相同类型的聊天工具,分析其应有的基本功能需求,结合自己的设计目标及意义,分析我们设计出什么样的功能才能达到所要的目标软件,以及何种创新功能才可与现有的同类型软件不同。同时根据自己目前的能力,分析自己能够实现什么样的功能需求,太复杂太困难的功能可能需要但能力的限制就无法进行设计。由此对课题进行功能分析可得如图3-1功能模块:图3-1 功能模块示意图(1) 用户注册模块:主要实现新用户的注册,通过Access设计一个简单的数据库存放注册用户的信息,实现用户注册正确性验证。(2) 用户登录模块:已经注册过的用户可以使用用户名和密码进行登录,如何登录成功则进入聊天工具,否则重新输入;(3) 注册信息显示模块:对在线的用户可以显示其注册的信息;(4) 发送消息显示模块:将用户发送的文本消息显示在文本显示框中;(5) 开启服务器模块:特定的用户登录后可以选择需要开启的服务器即聊天室;(6) 连接服务器模块:连接已经开启的服务器,如果未开启提示连接失败。4. 详细设计4.1 用户注册模块新用户可以单击聊天工具界面上的“注册”按钮,添加到用户列表中,注册的数据流程图如图4-1所画:图4-1 注册数据流程图4.2 用户登录模块 在用户使用该工具之前必须先进行登录,如果登录成功才可以使用该聊天工具,否则提示登录失败的信息,提醒用户是否注册过,或者密码是否填写正确。图4-2 用户登录数据流图4.3 数据表设计 该数据表是使用Access2003创建的,主要用来存储用户注册的用户信息,例如用户的用户名、性别、班级等。在用户登录过程中通过查找该表中的数据来确定用户是否存在,已经登录的用户名或者密码是否填写正确等匹配信息的作用,同时也作为注册用户显示列表框的数据来源。表4-1 用户信息表字段名类型大小是否为主键描述studentnum字符串50是学生的学号username字符串50否注册用户的用户名loginpsw字符串50否用户密码sex字符串50否注册用户性别age字符串50否注册用户年龄grade字符串30否用户所在年级class字符串50否用户所在班级academy字符串50否用户所在学院post字符串20否用户身份4.4信息显示模块注册信息显示模块:当在在线用户列表中单击该用户可以查看该用户注册的用户信息,如学院、班级、年级等;发送信息显示模块:显示在聊天室中的用户发送出来信息内容,当一个用户进入聊天室时,文字提示其进入聊天室。4.5开启服务器模块图示4-3描述的是服务器与客户端交互数据流图,其服务器端编程的步骤如下:1 加载套接字库,创建套接字(WSAStartup()/socket(); 2 绑定套接字到一个IP地址和一个端口上(bind(); 3 将套接字设置为监听模式等待连接请求(listen(); 4 求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept(); 5 用返回的套接字和客户端进行通信(send()/recv(); 6 返回,等待另一连接请求; 7关闭套接字,关闭加载的套接字(closesocket()/WSACleanup()。 4.6连接服务器模块图示4-3描述的是服务器与客户端交互数据流图,其客户端编程的步骤如下:1 加载套接字库,创建套接字(WSAStartup()/socket(); 2 向服务器发出连接请求(connect(); 3 和服务器端进行通信(send()/recv(); 4 关闭套接字,关闭加载的套接字(closesocket()/WSACleanup()。图4-3 服务器与客户端交互数据流图5. 编码实现5.1用户注册模块用户注册界面效果示意图如图5-1所示。图5-1 用户注册界面实现主要代码如下:“开始注册”按钮实现如下:void CRegister:OnBnClickedRegComfirm()CString str,m_username,m_studentnum,m_loginpsw,m_sex,m_academy, m_grade,m_class,m_age,m_post;bool flag;bool flag1 = false;_bstr_t vSQL;CAdoAccess m_connect;GetDlgItemText(IDC_REG_USERNAME,m_username);GetDlgItemText(IDC_REG_STUDNETNUM,m_studentnum);GetDlgItemText(IDC_REG_PASSWORD,m_loginpsw);GetDlgItemText(IDC_REG_SEX,m_sex);GetDlgItemText(IDC_REG_AGE,m_age);GetDlgItemText(IDC_REG_GRADE,m_grade);GetDlgItemText(IDC_REG_ACADEMY,m_academy);GetDlgItemText(IDC_REG_CLASS,m_class);GetDlgItemText(IDC_REG_POST,m_post);_RecordsetPtr m_pRecordset;_bstr_t vSQL_find;_variant_t var_num;CString studentnum;vSQL_find=select * from regedit; m_pRecordset = m_connect.GetRecordset(vSQL_find); if (!m_pRecordset-adoBOF)m_pRecordset-MoveFirst();elseAfxMessageBox(_T(表内数据为空!);while (!m_pRecordset-adoEOF)var_num=m_pRecordset-GetCollect(studentnum);if (var_num.vt!=VT_NULL)studentnum=(LPCSTR)_bstr_t(var_num);if (studentnum = m_studentnum)flag1 = TRUE;break;m_pRecordset-MoveNext();if (m_username = | m_studentnum = | m_loginpsw = )AfxMessageBox(_T(请输入必填的用户名,学号,密码三项!);else if (m_loginpsw.GetLength() != 6)AfxMessageBox(_T(密码必须是六位,请从新输入!);SetDlgItemText(IDC_REG_PASSWORD,_T();else if (flag1)AfxMessageBox(_T(该账户已经注册过,请重新输入!);SetDlgItemText(IDC_REG_STUDNETNUM,_T();SetDlgItemText(IDC_REG_PASSWORD,_T();elsestr.Format(_T(insert into regedit (username,studentnum,loginpsw,sex,age,academy,grad e,class,post) values (%s,%s,%s,%s,%s,%s,%s,%s,%s),m_username,m_studentnum,m_loginpsw,m_sex,m_age,m_academy,m_grade,m_class,m_post);vSQL = str.GetBuffer(str.GetLength();flag = m_connect.ExecuteSQL(vSQL); if(flag)CDialogEx:OnOK();AfxMessageBox(_T(注册成功,请登录!);elseAfxMessageBox(_T(请重新注册!);连接数据库实现代码如下:void CADOConn:OnInitADOConn():CoInitialize(NULL);trym_pConnection.CreateInstance(ADODB.Connection;_bstr_t strConnect=Provider=Microsoft.Jet.OLEDB.4.0;Data Source=gnnu.mdb;m_pConnection-Open(strConnect,adModeUnknown);catch(_com_error e)AfxMessageBox(_T(数据库连接失败,确认数据库路径是否正确!); RecordsetPtr& CADOConn:GetRecordset(_bstr_t bstrSQL)tryif(m_pConnection=NULL)OnInitADOConn(); m_pRecordset.CreateInstance(_uuidof(Recordset);m_pRecordset-Open(bstrSQL, m_pConnection.GetInterfacePtr(), adOpenDynamic,adLockOptimistic,adCmdText);catch(_com_error e)AfxMessageBox(_T(不能打开记录集!); return m_pRecordset;BOOL CADOConn:ExecuteSQL(_bstr_t bstrSQL)tryif(m_pConnection=NULL)OnInitADOConn();m_pConnection-Execute(bstrSQL,NULL,adCmdText);return true;catch(_com_error e)AfxMessageBox(_T(不能打开记录集!); return false;void CADOConn:ExitConnect()if(m_pRecordset!=NULL)m_pRecordset-Close();m_pConnection-Close(); :CoUninitialize();5.2 用户登录模块用户登录界面效果示意图如图5-2所示。图5-2 登录界面主要实现代码如下:void CLogin:OnBnClickedBtnLogin()CString m_loginnum,m_loginpsw;GetDlgItemText(IDC_LOGIN_STUDENTNUM,m_loginnum);GetDlgItemText(IDC_LOGIN_PASSWORD,m_loginpsw);_bstr_t vSQL;_variant_t var_num,var_psw,var_post,var_name;CString studentnum=_T();CString loginpsw=_T();CString post=_T();CString username=_T();vSQL=select * from regedit; m_pRecordset = m_LoginConn.GetRecordset(vSQL); if (!m_pRecordset-adoBOF)m_pRecordset-MoveFirst();elseAfxMessageBox(_T(表内数据为空!);if (CButton *)GetDlgItem(IDC_POST_STUDENT)-GetCheck() = 1)m_Post = 1;while (!m_pRecordset-adoEOF)var_num=m_pRecordset-GetCollect(studentnum);var_psw=m_pRecordset-GetCollect(loginpsw);var_post=m_pRecordset-GetCollect(post);var_name=m_pRecordset-GetCollect(username);if (var_num.vt!=VT_NULL & var_psw.vt!=VT_NULL&var_post.vt!=VT_NULL)studentnum=(LPCSTR)_bstr_t(var_num);loginpsw=(LPCSTR)_bstr_t(var_psw);post=(LPCSTR)_bstr_t(var_post);username=(LPCSTR)_bstr_t(var_name);if (studentnum = m_loginnum )if (loginpsw = m_loginpsw)if (CButton *)GetDlgItem(IDC_POST_MANAGER)-GetCheck() = 1)authpost = post;SetAuthority();if (post != _T(班主任) & post != _T(年级主任) & post != _T(学院领导) & post != _T(校领导)AfxMessageBox(_T(您不属于管理员身份,请重新登录!);SetDlgItemText(IDC_LOGIN_STUDENTNUM,_T();SetDlgItemText(IDC_LOGIN_PASSWORD,_T();break;AfxMessageBox(_T(登录成功!请打开网络设置选择要进入的聊天室!);LoginSuccess = 1;m_Showname = username;CDialog:OnCancel();break;elseAfxMessageBox(_T(密码输入错误,请从新输入!);SetDlgItemText(IDC_LOGIN_PASSWORD,_T();break;elsem_pRecordset-MoveNext();if (m_pRecordset-adoEOF)AfxMessageBox(_T(用户名不存在,请注册!);5.3 注册信息显示模块注册用户信息显示效果如图5-3所示。图5-3 用户注册信息显示主要实现代码如下:void CChatRoomDlg:ShowRegUser()_bstr_t vSQL;_variant_t var0,var1,var2,var3,var4;CString m_yhm,m_xy,m_nj,m_bj,m_zw;_RecordsetPtr m_pRecordset;CAdoAccess m_adoconnet;int i=0;m_UserList.InsertColumn(0,_T(ID);m_UserList.InsertColumn(1,_T(用户名);m_UserList.InsertColumn(2,_T(学院);m_UserList.InsertColumn(3,_T(年级);m_UserList.InsertColumn(4,_T(班级);m_UserList.InsertColumn(5,_T(职务);CRect rectlist;m_UserList.GetClientRect(rectlist);for(int w=0;wadoBOF)m_pRecordset-MoveFirst();elseAfxMessageBox(_T(表内据为空!);while (!m_pRecordset-adoEOF)var0=m_pRecordset-GetCollect(username);var1=m_pRecordset-GetCollect(academy);var2=m_pRecordset-GetCollect(grade);var3=m_pRecordset-GetCollect(class);var4=m_pRecordset-GetCollect(post);if(var0.vt!=VT_NULL&var1.vt!=VT_NULL& var2.vt!=VT_NULL&var3.vt!=VT_NULL & var4.vt!=VT_NULL)m_yhm=(LPCSTR)_bstr_t(var0);m_xy=(LPCSTR)_bstr_t(var1);m_nj=(LPCSTR)_bstr_t(var2);m_bj=(LPCSTR)_bstr_t(var3);m_zw=(LPCSTR)_bstr_t(var4);CString id;id.Format(_T(%d),i+1);m_UserList.InsertItem(i,id);m_UserList.SetItemText(i,1,m_yhm);m_UserList.SetItemText(i,2,m_xy);m_UserList.SetItemText(i,3,m_nj);m_UserList.SetItemText(i,4,m_bj);m_UserList.SetItemText(i,5,m_zw);m_pRecordset-MoveNext();i+;5.4 发送信息显示模块发送信息界面效果如图5-4所示。图5-4 发送消息显示界面主要实现代码如下:“发送消息”按钮响应函数如下:void CChatRoomDlg:OnBnClickedSendmsg()CString strMsg;GetDlgItemText(IDC_INPUT_MSG, strMsg);if ( m_bIsServer = TRUE ) strMsg = _T(服务器:) + strMsg;ShowMsg(strMsg);SendClientsMsg(strMsg);else if (m_bIsServer = FALSE) CString strTmp = _T(本地客户端:) + strMsg;ShowMsg(strTmp);int iSend= send(m_ConnectSock,(char*)strMsg.GetBuffer(), strMsg.GetLength()*sizeof(TCHAR), 0);strMsg.ReleaseBuffer();elseAfxMessageBox(_T(请您先进入聊天室!);SetDlgItemText(IDC_INPUT_MSG, _T();发送消息函数如下:void CChatRoomDlg:SendClientsMsg(CString strMsg, CClientItem *pNotSend)TCHAR szBufMAX_BUF_SIZE = 0;_tcscpy_s(szBuf, MAX_BUF_SIZE, strMsg);for( INT_PTR idx = 0; idx m_Socket!= ClientArray.GetAt(idx).m_Socket|pNotSend-hThread!= m_ClientArray.GetAt(idx).hThread |pNotSend-m_strIp!=m_ClientArray.GetAt(idx).m_strIp) send(m_ClientArray.GetAt(idx).m_Socket, (char*)szBuf, _tcslen(szBuf)*sizeof(TCHAR), 0);5.5 开启服务器模块开启服务器选项界面效果如图5-5:图5-5 开启服务界面主要代码如下:“开启服务器”按钮实现函数,调用了一个线程函数执行:void CChatRoomDlg:OnBnClickedStartServer()m_hListenThread = CreateThread(NULL, 0, ListenThreadFunc, this, 0, NULL);具体线程函数实现代码如下:DWORD WINAPI ListenThreadFunc(LPVOID pParam)CChatRoomDlg *pChatRoom = (CChatRoomDlg *)pParam;ASSERT(pChatRoom != NULL);pChatRoom-m_ListenSock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);if ( pChatRoom-m_ListenSock = INVALID_SOCKET ) AfxMessageBox(_T(新建Socket失败!);return FALSE;int iPort = pChatRoom-GetDlgItemInt(IDC_LISTEN_PORT);if ( iPort 65535 ) AfxMessageBox(_T(请输入合适的端口:1 - 65535);goto _Error_End;sockaddr_in service;service.sin_family = AF_INET;service.sin_addr.s_addr = INADDR_ANY;service.sin_port = htons(iPort);if ( bind(pChatRoom-m_ListenSock, (sockaddr*)&service, sizeof(sockaddr_in) = SOCKET_ERROR ) AfxMessageBox(_T(绑定端口失败!);goto _Error_End;if( listen(pChatRoom-m_ListenSock, 5) = SOCKET_ERROR ) AfxMessageBox(_T(监听失败!);goto _Error_End;pChatRoom-ShowMsg(_T(系统信息:启动服务器成功!);pChatRoom-m_bIsServer = TRUE;pChatRoom-EnableWindow(IDC_START_SERVER, FALSE);pChatRoom-EnableWindow(IDC_STOP_SERVER);while( TRUE & !(pChatRoom-bShutDown) if ( SOCKET_Select(pChatRoom-m_ListenSock, 100, TRUE) ) sockaddr_in clientAddr;int iLen = sizeof(sockaddr_in);SOCKET accSock = accept(pChatRoom-m_ListenSock, (struct sockaddr *)&clientAddr , &iLen);if (accSock = INVALID_SOCKET) continue;CClientItem tItem;tItem.m_Socket = accSock;tItem.m_pMainWnd = pChatRoom;tItem.m_strIp = inet_ntoa(clientAddr.sin_addr);INT_PTR idx = pChatRoom-m_ClientArray.Add(tItem);tItem.hThread = CreateThread(NULL, 0, ClientThreadProc, &(pChatRoom-m_ClientArray.GetAt(idx), CREATE_SUSPENDED, NULL)pChatRoom-m_ClientArray.GetAt(idx).hThread=tItem.hThread;ResumeThread(tItem.hThread);CString strMsg;strMsg = _T(客户端:) + tItem.m_strIp + _T( 进入聊天室);pChatRoom-ShowMsg(strMsg);pChatRoom-SendClientsMsg(strMsg, &tItem);Sleep(100);_Error_End:closesocket(pChatRoom-m_ListenSock);return TRUE;5.6连接服务器模块连接服务器界面效果如图5-6所示。图5-6 连接服务器界面其主要实现代码如下:“连接服务器”按钮实现代码:DWORD WINAPI ConnectThreadFunc(LPVOID pParam)CChatRoomDlg *pChatRoom = (CChatRoomDlg *)pParam;ASSERT(pChatRoom != NULL);pChatRoom-m_ConnectSock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);if ( pChatRoom-m_ConnectSock = INVALID_SOCKET ) AfxMessageBox(_T(新建Socket失败!);return FALSE;CString strServIp;pChatRoom-GetDlgItemText(IDC_IP_ADDR, strServIp);int iPort = pChatRoom-GetDlgItemInt(IDC_CONNECT_PORT);if ( iPort 65535 ) AfxMessageBox(_T(请输入合适的端口:1 - 65535);goto _Error_End;char szIpAddr16 = 0;USES_CONVERSION;strcpy_s(szIpAddr, 16, T2A(strServIp);sockaddr_in server;server.sin_family = AF_INET;server.sin_port = htons(iPort);server.sin_addr.s_addr = inet_addr(szIpAddr);if ( connect(pChatRoom-m_ConnectSock, (struct sockaddr *)&serv
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论