基于对话框的聊天程序.docVIP

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
 基于对话框的聊天程序

基于对话框的聊天程序 实验目的: 通过对网络编程的学习,设计一个基于对话框的聊天程序,实现发送与接收,完成了由接受知识到掌握技能的转化。本课程设计为学生提供了一个既动手又动脑,自学、查资料、独立实践的机会。将本学期课本上的理论知识和实际有机的结合起来,锻炼学生实际分析问题和解决问题的能力,提高学生适应实际、实践编程的能力,使对C++系统编程有了更加深刻的了解。 实验内容: 本课程设计主要解决客户端与服务器端的信息交换。 此程序主要分为两个部分:服务器端和客户端。服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务器端,然后进行网络通迅。客户端可通过服务器端的端口发送连接请求,然后登录聊天室。启动服务器聊天程序。这时聊天服务器需要指定一个端口号,客户端则根据这个端口号以及服务器的网络地址进行通信。通过分析,该程序完全可以在VisualC++中MFC完成 三、总体设计思路: 设计要求: 采用客户端/服务器模式,分为客户端与服务器端程序 功能要求: 客户端能够与服务器连接,客户端能够发送信息,服务器端能够接收信息。 主要功能描述: 这个聊天室应用程序是基于客户端/服务器端模型的,一个服务器只能支持一个客户,因此它实际上是一个基于“点对点”模型的应用程序。通过这个应用程序,用户可以在两台计算机之间进行字符串传输—即可以为两个人进行网上聊天提供服务,而且两个人的传输的字符串被保留在程序的列表框中,并且进行分类,分为传送和接收的字符串。 实验流程: 首先利用对话框建立聊天程序的界面:如下 最上面是一个接受数据的编辑框,下面分别是一个接收IP地址和发送数据的编辑框,左下角是发送数据的按钮。 加载套接字库。在MFC中AfxSocketInit()加载套接字库。需要注意的是这个函数要在程序的初始化函数中调用,即在Appliacation的InitInstance()中调用AfxSocketInit()。所以设置一个if语句判断是否加载成功: if(!AfxSocketInit()) { AfxMessageBox(加载套接字失败); return FALSE; } 3.初始化套接字。在CBDlg中添加一个成员函数InitSock(),用来初始化套接字,BOOL CBDlg::InitSocket() { m_socket=socket(AF_INET,SOCK_DGRAM,0); if(INVALID_SOCKET==m_socket) { MessageBox(套接字创建失败!); return FALSE; } SOCKADDR_IN addrSock; addrSock.sin_family=AF_INET; addrSock.sin_port=htons(6000); addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //INADDR_ANY表示接受任意地址 int retval; //用来接受bind返回值 retval=bind(m_socket,(SOCKADDR*)addrSock,sizeof(SOCKADDR)); if(SOCKET_ERROR==retval) { closesocket(m_socket); MessageBox(绑定失败); return FALSE; } }很重要的一点是之后在对话框初始化函数OnInitDlg()中调用InitSock()。 4.编写接收端程序 1)创建多线程。接受数据时,如没有数据到来,则会阻塞,导致程序暂停运行,所以把接受数据工作放到单独的线程中。在OnInitDlg()中创建多线程。因为需要给线程传递一个通信的套接字和响应消息的窗口句柄,所以需要额外定义一个结构体,用来存储这两个参数。 struct RECVPARAM { SOCKET sock; HWND hwnd; }; 2).实现线程过程函数。如果要求不能用全局函数的话,那线程过程函数就要定义为static(它属于类本身).在线程过程函数中循环接受消息,利用::PostMessgae()函数给接受数据编辑框发送消息,以实现显示信息的功能。 3).自定义消息的实现。因为在PostMessage中是自定义的消息(WM_RECVDATA),所以需要完成消息映射。 (1)定义消息值: #define WM_RECVDATA WM_USER+1 (2)声明消息处理函数: afx_msg void OnRecvData(WPARAM wParam,LPARAM lParam); (3)完成消息映射: ON_MESSAGE(WM

文档评论(0)

youshou998 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档