精品基于Winsock的网络聊天软件设计本科计算机论文定.docx
《精品基于Winsock的网络聊天软件设计本科计算机论文定.docx》由会员分享,可在线阅读,更多相关《精品基于Winsock的网络聊天软件设计本科计算机论文定.docx(30页珍藏版)》请在冰豆网上搜索。
精品基于Winsock的网络聊天软件设计本科计算机论文定
摘要
随着计算机网络技术的飞速发展,网络技术越来越受到人们的重视,它已逐渐渗入我们生活各个层面。
人们也越来越重视网络的应用,特别是在及时性通讯发面,相对于E-MAIL,即时聊天拥有具有双向互动性和即时性,目前都有很多的流行即时聊天软件,如QQ,MSN,新浪UC,网易POPO,YAHOO通等,为人们的通信提供了极大的方便。
但是这些都是互联网中实现的,而局域网则有很大的限制。
本文对局域网聊天编程技术进行了简要分析,研究了WinSock编程通信机制,如winpcap、原始套接字。
文中首先分析了TCP/IP和网络聊天软件的原理,并介绍了C/S工作模式,然后研究了WinSock编程通信机制。
本文的目标是基于WinSock技术实现一个网络聊天通信程序,其工作机制模仿即时通信软件的基本功能,包括申请帐号,登陆,密码验证,聊天室,私聊等。
采用TCP/IP原理,分别为客户端和服务器端完成基本数据配置,实现网络聊天功能。
在设计过程中,主要采用VC++6.0编程环境,ACCESS数据库环境,使用C++语言进行程序的编写,程序通过调试运行并且经过完善后,基本实现了设计的目标,能很好地在局域网环境实现即时聊天。
ABSTRACT
Withtherapiddevelopmentofcomputernetworktechnology,moreandmoreattentiontaketonetworktechnology,ithasgraduallyinfiltratedallaspectsofourlives.Thereisalsoincreasingemphasisonnetworkapplications,particularlyinthetimelinessofcommunicationstoleadtheway,asopposedtoE-MAIL,IMhasatwo-wayinteractivityandimmediacy,thereisnowalotofpopularinstantmessagingsoftwaresuchasQQ,MSN,SinaUC,NetEasePOPO,YAHOO-talk,forpeopletocommunicationsprovidedgreatconvenience.ButtheseareimplementedintheInternet,andLANhaveconsiderablelimitations.
ThisprogrammingtechniqueontheLANchatabriefanalysisoftheWinSockprogrammingcommunicationmechanisms,suchasWinpcap,rawsocket.ThepaperfirstanalyzestheTCP/IPandInternetchatsoftware,theory,andintroducedtheC/Smode,thenthecommunicationmechanismoftheWinSockprogramming.ThisgoalisanetworktechnologybasedonWinSockchatcommunicationprogram,theworkingmechanismofimitatingreal-timecommunicationsoftware'sbasicfeatures,includinganaccount,login,passwordauthentication,chatrooms,privatechatandsoon.UsingTCP/IPPrinciples,namelyclientandserver-sidedatatocompletethebasicconfigurationfornetworkchat.Inthedesignprocess,mainlyinVC++6.0programmingenvironment,ACCESSdatabaseenvironment,usingC++languageprogramwriting,debuggingandrunningprograms,andthroughtheperfection,thebasicdesigntoachievethegoal,toachievewellintheLANenvironmentreal-timechat.
绪论
当今互联网的发展,为人们的生活带来了极大的便利,网上聊天,网上办公,网络在人们的生活中已经无处不在。
互联网是人类社会有史以来第一个世界性的图书馆和第一个全球性论坛。
即时通讯(InstantMessenger,简称IM)软件可以说是目前我国上网用户使用率最高的软件,无论是老牌的ICQ,还是国内用户量第一的腾讯QQ,以及微软的MSN都是大众关注的焦点,它们能让你迅速地在网上找到你的朋友或工作伙伴,可以实时交谈和互传信息。
而且,还集成了数据交换、语音聊天、网络会议、电子邮件等功能。
IM软件的历史并不久远,但是它一诞生,就立即受到网民的喜爱,并风靡全球。
在它的发展史上,以色列人是功不可没的。
正是四位以色列籍的年轻人,在1996年7月成立的Mirabilis公司,并于同年11月推出了全世界第一个即时通讯软件ICQ,取意为“我在找你”——“ISeekYou”,简称ICQ了。
目前,国内最为流行的即时通讯软件是OICQ(简称QQ)。
它以良好的中文界面和不断增强的功能形成了QQ网络文化。
Messenger虽出道较晚,但依托微软的强大背景,实力也不可小视。
作为WindowsXP的一部分,Messenger整合了操作系统的许多功能,如多种形式的聊天选择、多人的单窗口讨论式交流以及充分的文件与桌面共享功能等。
它的令人耳目一新的中文界面和注册方式,连同它强大的功能,着实吸引了众多的眼球的注视,此外还有许多有特点的IM软件。
但是无论是腾讯QQ,还是微软MSN都是建立在互联网上的即时通讯软件,更多情况下是我们处于一个局域网中,在局域网没有连通Internet的情况下,无法使用QQ,MSN等互联网聊天工具,这就使人们的交流面临新的问题,此时就需要一个能互相交流的能在局域网中运行的聊天工具,局域网聊天软件因此诞生。
本文讨论一种基于Socket的局域网聊天软件的设计与具体实现方法。
基于Socket的局域网聊天软件可以为局域网内用户提供一种快捷,良好,方便的通信方式,局域网内的全部机子可以通过一个服务器建立的聊天室进行聊天。
对于它的实现,用户不需对原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地提高局域网的使用效率,可以很好地解决用户内部局域网的即时通信需求。
基于Socket的局域网聊天软件是局域网通信软件的具体实例之一,它很好地诠释了Socket通信的原理,并且在局域网内部通信具有一定的实用价值。
它具有信息收发速度快,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点。
本文中所讨论的基于Socket的局域网聊天软件应用范围广阔,不但可以处理传统的通信需求,而且也能扩展以适应用户更丰富的网络应用,如语言聊天,视频聊天,文件传输,远程协助等,拥有广泛的应用前景。
由于本文篇幅有限,本人在此只讨论了最基本的基于文字的聊天方式。
第一章即时通信软件相关技术
第一节TCP/IP相关原理
一、TCP/IP相关原理
下面首先介绍OSI参考模型及TCP/IP参考模型。
OSI模型(opensysteminterconnectionreferencemodel,开放系统互连)是基于国际标准化组织(ISO)的建议而发展起来的,它分为如图1.1所示的七层。
当卫星和无线网络出现以后,现有的协议在和这些网络互联时出现了问题,所以需要一种新的参考体系结构,能无缝地连接多个网络。
这个体系结构就是TCP/IP参考模型。
图1.1TCP/IP参考模型
因特网在传输层有两种主要的协议:
一种是面向连接的协议,一种是无连接的协议。
传输控制协议TCP是(transmissioncontrolprotocol,传输控制协议)专门用于在不可靠的因特网上提供可靠的、端对端的字节流通信的协议。
通过在发送方和接收方分别创建一个称为套接字的通信端口就可以获得TCP服务。
所有的TCP连接均是全双工的和点到点的。
二、TCP建立
TCP实体所采用的基本协议是滑动窗口协议。
当发送方传送一个数据报时,它将启动计时器。
当该数据报到达目的地后,接收方的TCP实体向回发送一个数据报,其中包含有一个确认序号,它等于希望收到的下一个数据报的顺序号。
如果发送方的定时器在确认信息到达之前超时,那么发送方会重发该数据报[1]。
建立一个TCP连接,需要三次握手,连接才能建立起来。
如图1.2
图1.2三次握手
握手过程的第一个段的代码位设置为SYN,序列号为x,表示开始一次握手。
接收方收到这个段后,向发送者回发一个段。
代码位设置为SYN和ACK,序列号设置为y,确认序列号设置为x+1。
发送者在受到这个段后,知道就可以进行TCP数据发送了,于是,它又向接收者发送一个ACK段,表示,双方的连接已经建立。
在完成握手之后,就开始正式的数据传输了。
通信完结束后,就要释放连接了有客户方请求释放连接,被动方接到信号后,给客户端发出一个确认信号,告知已经收到它的信息。
如果服务器端没有信息发送的话,就给客户端发送一个信息,告知自己也没有信息发送了,客户端此时回应信息,到此,连接就彻底结束了。
上面握手段中的序列号都是随机产生的。
三、TCP传输原理
TCP协议在IP协议之上。
与IP协议提供不可靠传输服务不同的是,TCP协议为其上的应用层提供了一种可靠传输服务。
这种服务的特点是:
可靠、全双工、流式和无结构传输。
它是通过一下步骤来实现可靠传输的:
TCP协议使用了一个叫积极确认和重发送(positiveacknowledgementwithretransmission)的技术来实现这一点的。
接收者在收到发送者发送的数据后,必须发送一个相应的确认(ACK)消息,表示它已经收到了数据。
发送者保存发送的数据的记录,在发送下一个数据之前,等待这个数据的确认消息。
在它发送这个数据的同时,还启动了一个记时器。
如果在一定时间之内,没有接收到确认消息,就认为是这个数据在传送时丢失了,接着,就会重新发送这个数据。
第二节Socket套接字
一、Socket概述
套接字(Socket)是VC++网络编程的基础。
是VC++网络程序位于最上层——应用层,并且通过套接字访问底层网络,也可以说,套接字为应用层封装了底层网络传输数据的细节。
大多数网络程序都采用客户/服务器模式,客户端发出获得特定服务的请求,服务器接收请求,执行客户端所请求的操作,然后向客户端发回响应。
Socket最早是Unix操作系统中的概念,是为方便网络编程而开发出的一个程序接口,后来被广泛地应用在各种平台及系统中。
在Internet/Intranet领域中,Socket也是一个相当重要的概念。
Socket译为中文为套接字,指两个程序间进行双向数据传输的网络通信端点,是网上两个主机之间必要的数据无缝传输。
Socket由每一个主机的终点和端口地址加以区别。
利用Socket可以与相应的服务进行通信[2]。
当一个Socket建立后,它就与本地的IP地址联系起来,IP地址仅简单地指定出入主机的特定路径,而连接亦可有多个。
套接字地址完整地说是应用端口号、协议和本地IP地址的集合,它形成一个应用链路的终点,有效的激活一个套接字到套接字的连接。
Socket通信机制提供了两种通信方式,即:
面向连接的通信方式和面向无连接的方式。
在设计时我们采用了前者,也就是面向连接的通信方式,即通信前必须进行一次连接,从而建立起一条通信链路,并以字节流的形式在通信双方之间进行数据传输服务,它是一种安全、可靠的通信方式。
Socket实现客户-服务器(Client/Server)模式的通信方式,它首先需要建立稳定的连接,然后以流的方式传输数据,实现网络通信。
网络编程简单的理解就是两台计算机相互通讯数据。
MFC提供一些相对简单的API来完成这些工作,Socket就是其中之一。
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。
Socket通常用来实现客户方和服务方的连接。
Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
网络编程的基本模型就是客户机到服务器模型。
简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置,并去建立两者之间的联系,然后完成数据的通讯,基于这个简单的模型,就可以进入网络编程。
从套接字所处的地位来讲,套接字上连应用进程,下连网络协议栈,是应用进程通过网络协议栈进行通信的接口,是应用进程与网络协议栈进行交互的接口。
套接字的类型:
SOCK_STREAM流套接字,提供面向连接,可靠的数据传输服务;
SOCK_DGRAM数据报套接字,提供面向无连接的服务;
SOCK_RAW原始套接字,运行对低于传输层的协议或者物理网络直接访问。
二、Socket通信模式
图1.3Socket通信模式
由图可以看出,Socket的通信步骤如下[3]:
服务器端:
(1)加载套接字库,创建套接字socket()。
(2)绑定套接字到一个IP地址和一个端口上bind()。
(3)将套接字设置为监听模式等待连接请求listen()。
(4)请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字accept()。
(5)用返回的套接字和客户端进行通信send()/recv()。
(6)返回,等待另一连接请求。
(7)关闭套接字,关闭加载的套接字库closesocket()。
客户端:
(1)加载套接字库,创建套接字socket()。
(2)向服务器发出连接请求connect()。
(3)和服务器端进行通信send()/recv()。
(4)关闭套接字,关闭加载的套接字库closesocket()。
套接字地址结构说明:
structsockaddr_in
{
shortsin_family;//AF_INET
u_shortsin_port;//16位端口号,网络字节顺序
structin_addrsin_addr;//32位IP地址,网络字节顺序
charsin_zero[8];//保留,全0
}
创建套接字——socket()
功能:
使用前创建一个新的套接字格式:
socket(intfamily,inttype,intprocotol);第一个参数指明协议族,第二个指明套接字类型,第三个是协议标志。
指定本地地址——bind()
功能:
将套接字地址与所创建的套接字号联系起来。
格式:
bind(SOCKETs,conststructsockaddrFAR*name,intnamelen);参数:
s:
是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。
其它:
没有错误,bind()返回0,否则SOCKET_ERROR。
监听连接——listen()
功能:
用于面向连接服务器,表明它愿意接收连接。
格式:
listen(SOCKETs,intbacklog);第一个参数是要设置的描述符,第二个参数规定了请求队列中的最大连接数。
请求建立连接——connect()
客户端调用connect连接服务器端,其格式如下connect(SOCKETs,conststructsockaddrFAR*name,intnamelen);第一个参数是SOCKET函数返回的套接字描述符,第二个参数是指向服务器的套接字地址结构的指针,第三个该套接字地址结构的大小。
接受建立连接——accept()
功能:
共同完成连接工作格式:
accept(SOCKETs,structsockaddrFAR*name,intFAR*addrlen);一个参数是SOCKET函数返回的套接字描述符,第二个参数是由CLIENT参数返回客户端的协议地址,第三个该套接字地址结构的大小。
关闭套接字——closesocket()
功能:
关闭套接字s格式:
closesocket(SOCKETs);参数是指要关闭的套接字的描述符。
TCP套接字提供send()/recv()函数来发送和接收操作:
Send(intsockfd,constvoid*buf,size_tlen,intflag);第一个参数是套接字描述符,buf是一个指向用于发送信息的数据缓冲区,len只传送数据缓冲区的大小,flags是传输控制标志。
Recv(intsockfd,constvoid*buf,size_tlen,intflag);第一个参数对服务器是accept函数返回的已连接的套接字描述符,对客户端是socket函数返回的套接字描述符buf是一个指向用于接收信息的数据缓冲区,len只传送数据缓冲区的大小,flags是传输控制标志。
第三节MFC微软基础类
一、WinSockAPI
WinSockAPISocket接口是网络编程(通常是TCP/IP协议,也可以是其他协议)的API。
最早的Socket接口是Berkeley接口,在Unxi操作系统中实现。
WinSock也是一个基于Socket模型的API,在MicrosoftWindows操作系统类中使用。
它在Berkeley接口函数的基础之上,还增加了基于消息驱动机制的Windows扩展函数。
Winscok1.1只支持TCP/IP网络,WinSock2.0增加了对更多协议的支持。
这里,讨论TCP/IP网络上的API。
WinSock以DLL的形式提供,在调用任何WinSockAPI之前,必须调用函数WSAStartup进行初始化,最后,调用函数WSACleanUp作清理工作。
MFC使用函数AfxSocketInit包装了函数WSAStartup,在WinSock应用程序的初始化函数IninInstance中调用AfxSocketInit进行初始化。
程序不必调用WSACleanUp。
Socket是网络通信过程中端点的抽象表示。
Socket在实现中以句柄的形式被创建,包含了进行网络通信必须的五种信息:
连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
要使用socket,首先必须创建一个socket;然后,按要求配置socket;接着,按要求通过socket接收和发送数据;最后,程序关闭此socket。
二、MFC框架
由上面的介绍可以看出,直接用API函数开发一个WIN32程序是相当麻烦的,有好多既定的重复性的工作要做,所以微软就用C++的类机制将绝大部分的API函数进行了封装,构成了类,并且将基本的流程也封装在类机制下面,大大简化了WIN32开的的复杂性,尤其是在开发比较大型程序的时候这个便宜性更会得以体现。
它就是MicrosoftFoundationClasses,简称为MFC,可以说它是VC开发环境的一个核心构件。
MFC(MicrosoftFoundationClassLibrary)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。
因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。
MicrosoftVisualC++提供了相应的工具来完成这个工作:
AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑[4]。
Microsoft也提供了C++库,它位于任何WindowsAPI之上,能够使程序员的工作更容易。
它就是Microsoft基本类库(MFC),该库的主要优点是效率高。
它减少了大量在建立Windows程序时必须编写的代码。
同时它还提供了所有一般C++编程的优点,例如继承和封装。
MFC是可移植的,例如,在Windows3.1下编写的代码可以很容易地移植到WindowsNT或Windows95上。
因此,MFC很值得推荐的开发Windows应用程序的方法,在本教程自始至终使用的都是MFC。
当是使用MFC时,你编写的代码是用来建立必要的用户界面控制并定制其外观。
同时你还要编写用来响应用户操作这些控制的代码。
例如,如果用户单击一个按钮时,你应该有代码来响应。
这就是事件驱动代码,它构成了所有应用程序。
一旦应用程序正确的响应了所有允许的控制,它的任务也就完成了。
你可以看出,使用MFC进行Windows编程时是一件比较容易的的过程。
本教程的目的是比较详细地教你如何快速建立专业级的应用程序的技术。
VisualC++应用程序开发程序环境特别适合于使用MFC(也有其它开发环境使用MFC,译者注),所以一起学习MFC和VisualC++能够增强你的开发程序的能力。
MFC提供了两个类CAsyncSocket和CSocket来封装WinSockAPI,这给程序员提供了一个更简单的网络编程接口。
CAsyncSocket在较低层次上封装了WinSockAPI,缺省情况下,使用该类创建的socket是非阻塞的socket,所有操作都会立即返回,如果没有得到结果,返回WSAEWOULDBLOCK,表示是一个阻塞操作。
CAsyncSocket类所提供的唯一的抽象就是将与套接字相联系的Windows消息以回调函数的形式表示,因此它所带来的惟一方便就是程序员无需自行处理Winsock的I/O模型,而对如阻塞处理、字节排序差异以及Unicode等依然负有责任与灵活的控制权。
CSocket建立在CAsyncSocket的基础上,是CAsyncSocket的派生类,它提供了对通过CArchive对象使用套接字工作的更高级抽象。
CSocket类的使用比CAsyncSocket类更加容易,它继承了CAsyncSocket类的许多封装了API的成员函数,并且管理了通信的大多数方面,这使用户从原来不得不使用原始API或者CAsyncSocket类的繁杂工作中解脱出来。
更加重要的是CSocket类提供了对于同步操作CArchive对象十分重要的阻塞功能,且CSocket通过与类CSocketFile和CArchive一起来管理对数据的发送和接收,使收发数据的操作变得简单了,也就是缺省情况下使用该类创建的socket是非阻塞的socket,但是CSocket的网络I/O是阻塞的,它在完成任务之后才返回。
CSocket的阻塞不是建立在“阻塞”socket的基础上,而是在“非阻塞”socket上实现的阻塞操作,在阻塞期间,CSocket实现了