课程设计简易聊天_第1页
课程设计简易聊天_第2页
课程设计简易聊天_第3页
课程设计简易聊天_第4页
课程设计简易聊天_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计报告 课程名称:面向对象程序设计C+ 设计题目:简易聊天 专 业:计算机科学与技术 姓 名: 学 号: 指导教师: 李 晓 虹2016年1月1日一、Socket简介80年代初,美国政府的高级研究工程机构(ARPA)给加利福尼亚大学Berkeley分校提供了资金,让他们在UNIX操作系统下实现TCP/IP协议。在这个项目中,研究人员为TCP/IP网络通信开发了一个API(应用程序接口)。这个API称为Socket接口(套接字)。今天,SOCKET接口是TCP/IP网络最为通用的API,也是在INTERNET上进行应用开发最为通用的API。90年代初,由Microsoft联合了其他几家公司共同制定了一套WINDOWS下的网络编程接口,即WindowsSockets规范。它是BerkeleySockets的重要扩充,主要是增加了一些异步函数,并增加了符合Windows消息驱动特性的网络事件异步选择机制。WINDOWSSOCKETS规范是一套开放的、支持多种协议的Windows下的网络编程接口。从1991年的1.0版到1995年的2.0.8版,经过不断完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为Windows网络编程的事实上的标准。目前,在实际应用中的WINDOWSSOKCETS规范主要有1.1版和2.0版。两者的最重要区别是1.1版只支持TCP/IP协议,而2.0版可以支持多协议。2.0版有良好的向后兼容性,任何使用1.1版的源代码,二进制文件,应用程序都可以不加修改地在2.0规范下使用。SOCKET实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有SOCKET接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个SOCKET接口来实现。在应用开发中就像使用文件句柄一样,可以对SOCKET句柄进行读,写操作。Socket可以支持数据的发送和接收,它会定义一种称为套接字的变量,发送数据时首先创建套接字,然后使用该套接字的sendto等方法对准某个IP/端口进行数据发送;接收端也首先创建套接字,然后将该套接字绑定到一个IP/端口上,所有发向此端口的数据会被该套接字的recv等函数读出。如同读出文件中的数据一样。二、需求分析随着全球信息化的不断发展,网络也不断发展,对局域网的吞吐和处理信息的能力的要求不断提高,局域网已经不堪重负,制约了效率的提高。为了解决以上的矛盾,我们采用基于socket局域网通信的软件。基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业内部局域网的各种通信需求。 基于Socket的局域网聊天工具是此类局域网通信软件的具体实例之一,它很好地诠释了Socket通信的原理,并且在企业内部通信、教学、讨论等应用中都具有一定的实用价值。它具有信息收发速度快,保密性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点。 三、简要的接口命令介绍1.1SOCKET类型SOCKET是socket套接字类型,在WINSOCK2.H中有如下定义:typedef unsigned int u_int;typedef u_int SOCKET;可知套接字实际上就是一个无符号整型,它将被Socket环境管理和使用。套接字将被创建、设置、用来发送和接收数据,最后会被关闭。1.2WSAStartup函数WSAStartup函数被用来初始化Socket环境,它的定义如下:int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);其返回值为整型,调用方式为PASCAL(即标准类型,PASCAL等于_stdcall),参数有两个,第一个参数为WORD类型,指明了Socket的版本号,第二个参数为WSADATA类型的指针。若返回值为0,则初始化成功,若不为0则失败。1.3WSACleanup函数这是Socket环境的退出函数。返回值为0表示成功,SOCKET_ERROR表示失败。1.4socket函数socket的创建函数,其定义为:SOCKET PASCAL FAR socket (int af, int type, int protocol);第一个参数为int af,代表网络地址族,目前只有一种取值是有效的,即AF_INET,代表internet地址族;第二个参数为int type,代表网络协议类型,SOCK_DGRAM代表UDP协议,SOCK_STREAM代表TCP协议;第三个参数为int protocol,指定网络地址族的特殊协议,目前无用,赋值0即可。返回值为SOCKET,若返回INVALID_SOCKET则失败。1.5setsockopt函数这个函数用来设置Socket的属性,若不能正确设置socket属性,则数据的发送和接收会失败。定义如下:int PASCAL FAR setsockopt (SOCKET s, int level, int optname, const char FAR * optval, int optlen);其返回值为int类型,0代表成功,SOCKET_ERROR代表有错误发生。第一个参数SOCKET s,代表要设置的套接字;第二个参数int level,代表要设置的属性所处的层次,层次包含以下取值:SOL_SOCKET代表套接字层次;IPPROTO_TCP代表TCP协议层次,IPPROTO_IP代表IP协议层次(后面两个我都没有用过);第三个参数int optname,代表设置参数的名称,SO_BROADCAST代表允许发送广播数据的属性,其它属性可参考MSDN;第四个参数const char FAR * optval,代表指向存储参数数值的指针,注意这里可能要使用reinterpret_cast类型转换;第五个参数int optlen,代表存储参数数值变量的长度。1.6 sockaddr类型sockaddr类型是用来表示Socket地址的类型,同上面的sockaddr_in类型相比,sockaddr的适用范围更广,因为sockaddr_in只适用于TCP/IP地址。Sockaddr的定义如下:struct sockaddr u_short sa_family;char sa_data14;可知sockaddr有16个字节,而sockaddr_in也有16个字节,所以sockaddr_in是可以强制类型转换为sockaddr的。事实上也往往使用这种方法。1.7Sleep函数线程挂起函数,表示线程挂起一段时间。Sleep(1000)表示挂起一秒。定义于WINBASE.H头文件中。WINBASE.H又被包含于WINDOWS.H中,然后WINDOWS.H被WINSOCK2.H包含。所以在本例中使用Sleep函数不需要包含其它头文件。1.8sendto函数在Socket中有两套发送和接收函数,一是sendto和recvfrom;二是send和recv。前一套在函数参数中要指明地址;而后一套需要先将套接字和一个地址绑定,然后直接发送和接收,不需绑定地址。sendto的定义如下:int PASCAL FAR sendto (SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR *to, int tolen);第一个参数就是套接字;第二个参数是要传送的数据指针;第三个参数是要传送的数据长度(字节数);第四个参数是传送方式的标识,如果不需要特殊要求则可以设置为0,其它值请参考MSDN;第五个参数是目标地址,注意这里使用的是sockaddr的指针;第六个参数是地址的长度;返回值为整型,如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR。1.9closesocket关闭套接字,其参数为SOCKET类型。成功返回0,失败返回SOCKET_ERROR。四、关键代码及效果1.1在对话框中初始化套接字并侦听连接请求if(m_pCSocListen=new CSocListen(this)if(m_pCSocListen-Create(1000)/ 创建端口号m_lst_log.AddString(等待连接);m_pCSocListen-Listen();elsem_lst_log.AddString(初始化失败,请重新启动程序);delete m_pCSocListen;/ 清除侦听socket所占内存elsem_lst_log.AddString(初始化失败,请重新启动程序);上述代码主要是创建并初始化ServSock套接字,并开始侦听连接请求。1.2、接受连接请求void CSocListen:OnAccept(int nErrorCode) / TODO: Add your specialized code here and/or call the base classCSocRecv*pCSocRecv;/ 接收客户端消息类指针if(pCSocRecv=new CSocRecv(this-m_pDlgSocSvr)if(Accept(*pCSocRecv)pCSocRecv-m_pCSocFile = new CSocketFile(pCSocRecv); pCSocRecv-m_pCArcIn = new CArchive(pCSocRecv-m_pCSocFile,CArchive:load); pCSocRecv-m_pCArcOut= new CArchive(pCSocRecv-m_pCSocFile,CArchive:store);m_pDlgSocSvr-m_pCSocRecv = pCSocRecv;pCSocRecv = NULL; m_pDlgSocSvr-m_lst_log.AddString(连接成功,可以开始传递消息咯!);m_pDlgSocSvr-m_button_send.EnableWindow(TRUE);elsem_pDlgSocSvr-m_lst_log.AddString(试图连接客户端失败!);delete pCSocRecv;elsem_pDlgSocSvr-m_lst_log.AddString(连接套接字初始化失败!);CSocket:OnAccept(nErrorCode);1.3发送信息void CSocSvrDlg:OnBTNSend() CStringcsSenMsg;/ 要发送的消息m_edt_senMsg.GetWindowText(csSenMsg);/ 获得编辑框内容if(csSenMsg=)AfxMessageBox(空字符串,不能发送!);return;m_lst_log.AddString(你发出的信息如下:);m_lst_log.AddString(csSenMsg);m_lst_log.SetCurSel(m_lst_log.GetCount()-1);*(m_pCSocRecv-m_pCArcOut)m_pCArcOut-Flush();服务器端的界面如下:2.1、在对话框中初始化套接字并建立连接在对话框类的OnInitDialog函数中添加如下代码m_lst_log.AddString(正在连接);if(m_pCSocSend=new CSocSend(this)if(m_pCSocSend-Create()/ 创建套接字if(m_pCSocSend-Connect(localhost,1000)/ 服务器名称、端口号m_pCSocSend-m_pCSocFile = new CSocketFile(m_pCSocSend);m_pCSocSend-m_pCArcIn=newCArchive(m_pCSocSend-m_pCSocFile,CArchive:load);m_pCSocSend-m_pCArcOut=newCArchive(m_pCSocSend-m_pCSocFile,CArchive:store);m_lst_log.AddString(连接成功,可以开始传递消息咯!);m_btn_send.EnableWindow(TRUE);elsem_lst_log.AddString(连接不成功!);delete m_pCSocSend;/ 清除socket所占内存elsem_lst_log.AddString(初始化失败,请重新启动程序);delete m_pCSocSend;/ 清除socket所占内存elsem_lst_log.AddString(初始化失败,请重新启动程序);2.1、接收消息void CSocSend:OnReceive(int nErrorCode) / TODO: Add your specialized code here and/or call the base classCStringcsRecMsg;*m_pCArcIncsRecMsg;/ 获得服务器端传来的消息m_pDlgSocClt-m_lst_log.AddString(服务器端发来的消息如下:); / 在列表框中添加服务器端发来的消息 m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论