聊天程序说明.docxVIP

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

操作说明:在IP地址栏内输入127.0.0.1,即可实现本机对话。本程序将实验二、实验三的Client与Server集于一身。若要实现双人聊天,需要在两台PC上分别运行本程序。在IP地址栏内输入对方机器的IP地址,即可实现双人对话。程序诞生过程:新建工程,选择MFC的AppWizard,工程名字叫做Chat。选择基于对话框的应用程序(Dialog Based),完成。设置程序界面,如图:控件设置如下:1.主框(消息记录)中摆放一个编辑框(用来显示接收到的数据),ID号设置为IDC_EDIT_RECV。2.主框(发送消息)中,我们首先摆放一个IP地址控件,它可以让我们用点分十进制的格式输入一个IP地址;然后我们再摆放一个编辑框,它主要用来让用户输入需要发送的数据,然后根据用户输入的IP地址,将数据发送出去。它的ID号设置为IDC_EDIT_SEND;最后放置一个按钮(发送),ID号设置为IDC_BTN_SEND。因为是编写网络程序,所以要采用套接字来编写。首先第一步需要来加载套接字库,进行套接字库版本的协商。在MFC中,给我们提供了一个函数,它可以帮助我们加载套接字库进行版本协商。这个函数是afxSocketInit,它有一个参数,是指向WSADATA结构体的一个指针。在这个函数内部,它会帮我们加载套接字库,是1.1版本的套接字库。它还可以用WSACleanup终止套接字的调用。将这个函数在CChatApp中调用:BOOL CChatApp::InitInstance(){if (!AfxSocketInit())//如果加载套接字库失败,则提示用户加载失败,返回FALSE则程序终止{AfxMessageBox(IDP_SOCKETS_INIT_FAILED);return FALSE;}还需要添加头文件:在StdAfx.h中加入#include Afxsock.h。采用我们这种方式加载套接字库,不用链接库文件。接下来在CChatDlg中加载成员函数,做套接字库本身的初始化工作。类型设为BOOL,函数名为InitSocket。然后在这个类中增加成员变量,类型为SOCKET,名称为m_socket,访问权限设为私有的。BOOL CChatDlg::InitSocket(){m_socket=socket(AF_INET,SOCK_DGRAM,0);//创建套接字if(INVALID_SOCKET==m_socket)//socket函数的返回值是INVALID_SOCKET{MessageBox(套接字创建失败!);return FALSE;}……}SOCKADDR_IN addrSock; //因为这个程序既包含接收端,又包含发送端,而对于接收端程序来说,它需要绑定在某一个IP地址和端口上。首先定义一个地址结构体的变量。addrSock.sin_family=AF_INET;//对成员进行赋值。family为地址族。addrSock.sin_port=htons(6000);//设定端口为6000。addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//设置IP地址。接收发送到本地任意IP地址的数据。int retval;//用来接收bind函数的返回值。bind(m_socket,(SOCKADDR*)addrSock,sizeof(SOCKADDR));//进行绑定。if(SOCKET_ERROR==retval)//bind函数的返回值为SOCKET_ERROR。{closesocket(m_socket);//关闭套接字MessageBox(绑定失败!);return FALSE;}return TRUE;}将初始化函数放在OnInitDialog函数中调用一下:BOOL CChatDlg::OnInitDialog(){InitSocket();……}这样便完成了套接字初始化的工作。接下来编写接收端程序。当我们接收数据的时候,如果没有数据到来,则会导致Recvfrom函数的阻塞,从而使程序无法运行。所以我想把接收数据的任务放到一个单独的线程中进行。创建线程可以使用CreateThread函数。之后需要给这个线程传递两个参数,一个是我们创建的套接字,还有一个是对话框的句柄,也就是我们的接收编辑框的句柄。在这个线程中,当我们接收到数据之后,可以将数据传回给对话框,经过处理后显示在接收的编辑框中。但是CreateThread函数只提供了一个参数来对线程传送数据。然而我们要传递的是两个,于是想到结构体。这个结构体包含了要传递的两个参数。在CChatDlg这个类的头文件中,定义一个结构体。加入以下代码:struct RECVPARAM{SOCKET sock;//套接字类型的变量HWN

文档评论(0)

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

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

1亿VIP精品文档

相关文档