毕业设计(论文)-基于Visual-C++的一个简单的网络电话系统.docx_第1页
毕业设计(论文)-基于Visual-C++的一个简单的网络电话系统.docx_第2页
毕业设计(论文)-基于Visual-C++的一个简单的网络电话系统.docx_第3页
毕业设计(论文)-基于Visual-C++的一个简单的网络电话系统.docx_第4页
毕业设计(论文)-基于Visual-C++的一个简单的网络电话系统.docx_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

陕西理工学院毕业设计题 目 基于Visual C+的一个简单的网络电话系统学生姓名 学号 所在学院 物理与电信工程学院 专业班级 电子1201班指导教师 完成地点物电学院计算机信息处理实验室 2016 年 6 月 5 日毕业论文设计任务书院(系) 物电学院 专业班级 电子信息工程 学生姓名 一、毕业论文设计题目 基于Visual C+的一个简单的网络电话系统 二、毕业论文设计工作自_2016 _年_3 _月10 日 起至_ 2016_年 6 月 20 日止三、毕业论文设计进行地点: 物电学院计算机信息处理分室 四、毕业论文设计的内容要求:网络电话,是用户通过互联网直接拨打对方的固定电话或手机,包括国内长途和国际长途,而且费用比用传统电话拨打便宜5到10倍。为了节约通信成本。本设计要求学生在Visual C+环境下开发一个简单网络电话系统,可实现PC与PC、PC与Phone、phone与phone的通话功能。 五、 毕业论文设计应收集资料及参考文献: 1徐孝凯,张纪勇.C+面向对象程序设计:VC+6.0运行环境M.天津大学出版社2009. 2汪晓平,钟军.VC+网络通信协议分析与应用实现M.北京:人民邮电出版社,2003. 3王艳平,张越.Windows网络与通信程序设计M.北京:人民邮电出版社,2006. 4 Andrew S.Tanenbau.计算机网络(第四版)M.北京:清华大学出版社,2004. 5谢希仁.计算机网络(第五版)M.北京:电子工业出版社,2012. 6朱桂英.张元亮 Visual C+网络编程开发与实践M.清华大学出版社.2013. 六、毕业论文设计的进度安排: 3月2日3月29日:查阅资料,完成初步设计方案和开题报告。 4月1日4月26日:根据网络电话系统的工作原理,给出设计方案,及软件流程图。 4月29日5月24:并在软件环境下进行运行调试,进一步完善系统功能,整理资料; 5月27日6月7日:撰写、修改毕业设计论文。 6月10日6月15日:打印论文准备并完成答辩。 指导教师签名 系(教研室)主任签名专业负责人签名批准日期基于Visual C+的一个简单的网络电话系统(陕西理工学院物理与电信工程学院电子信息工程专业,2012级1班,陕西 汉中 723000)指导教师:摘要网络普及给人们的生活带来了巨大的变化,视频聊天、远程会议、远程监控等应用逐渐走进了人们的日常生活和商务应用中。本文基于Visual C+所开发的一个网络电话系统,利用传输控制协议和互联网协议原理、winsock以及流式套接字来完成程序的设计,用电脑通过客户端程序实现通话功能。在现实中众所周知,我们都了解电话通信需要花费一定的通信费用,因此开发这样的应用程序,可以很大地节约人们之间通信成本,方便交互与沟通,在未来也会得到更大的应用。关键字网络电话;winsock;TCP/IP;socketVisual C + based on a simple network telephone systemZhang Yibing(Shaanxi Institute of Physics and Telecommunication Engineering, Electronic and Information Engineering, 2012 class 1, Hanzhong, Shaanxi 723000)Tutor:Li JuyeAbstract:Internet popularity to peoples lives has brought great changes, video chat, teleconferencing, remote monitoring applications gradually into peoples daily life and business applications. Based on Visual C + developed a network telephone system, using the Transmission Control Protocol and Internet Protocol principles, winsock and stream socket to complete the design process, to achieve a computer call functionality through the client program. In reality we all know, we all know it takes a certain telephone communication communication costs, so the development of such applications, can greatly save the cost of communication between people, to facilitate interaction and communication in the future will get more applications.Keywords:voip;winsock;TCP/IP;socket目录1引言11.1研究背景11.1研究目的11.3开发环境11.3.1 VC+6.0平台11.3.2 开发语言C+21.3.3 Winsock21.4实现方式32 VoIP的概述42.1 网络电话技术原理的分析及实现42.1.1 网络电话原理42.1.2 网络基础知识42.1.3 网络编程基础72.1.4网络通信基本流程82.1.5 搭建开发环境82.1.6 套接字8 2.1.7 套接字相关类93网络电话系统软件模块的实现113.1网络通信113.2套接字响应函数194测试结果22I5结束语24致谢25参考文献26附录A27附录B31II1引言网络电话是建立在网络技术和通信技术基础上的新业务,是INTERNET上的一种话音增值业务,是使用互联网而不是传统的电路交换话音网络,采用存储转发的分组交换技术来传送语音信息。所以语音信号在IP网络上传送,首要先进行模拟语音信号的数字化处理,经过压缩处理后,被数据通信网中的IP电话网关打包,形成分组,在每个分组中都有被叫电话号码所对应的目的网关的IP地址,形成8kbit/s或更小带宽的数据流,然后才送到网络上进行实时传送。话音业务与其它业务的综合,以及良好的经济效益是网络电话产生与发展的强大动力。随着网络技术和通信技术的发展,网络电话正在以迅猛的速度发展起来1。1.1研究背景近年来,Internet技术日趋成熟,作为全世界使用最广泛的信息网络,Internet的开放性极大地方便了各种网络设备的联网,及资源的共享。日常通讯主要依靠电话、邮件等方式,显得太为麻烦,成本也比较高。而VoIP最大的优势是能广泛地采用Internet和全球IP互连的环境,提供比传统业务更多、更好、更快的服务。 VoIP可以在IP网络上便宜的传送语音、传真、视频、和数据等业务,如消息、虚拟云、虚拟语音/电子邮件、查号业务、视频通话、Internet呼叫管理、电视远程会议、电子商务、传真存储转发以及其它各种信息的存储转发等。虽然一次性投入比较多,但后期的通讯费用却能节省下很多,用户可以轻松简单地实现与世界任何地方的企业分支机构或个人的零费用沟通2。1.2研究目的网络电话(VoIP)是一种数字电话,是一种技术创新的通信服务业务。它把语音、压缩编码、打包分组、分配路由、存储交换、解包解压等交换处理在IP网或互联网上实现语音通信。它促进了网络资源利用,降低语音业务成本,因此在全球范围内得到了迅速的发展。通过互联网直接拨打对方的固定电话和手机,包括国内长途和国际长途,而且资费是传统电话费用的10%到20%,宏观上讲可以分为软件电话和硬件电话。软件电话就是在电脑上下载软件, 然后购买网络电话卡,然后通过耳麦实现和对方(固话或手机)进行通话;硬件电话比较适合公司、话吧等使用,首先要一个语音网关,网关一边接到路由器上,另一边接到普通的话机上,然后普通话机即可直接通过网络自由呼出了。技术改变生活,也在深刻影响着每一个人。1.3开发环境本文中网络电话系统使用C与C+语言Winsock网络编程和多线程技术通过CsocketServer服务器端和CsocketClient客户端两部分程序来实现网络电话的通话。1.3.1VC+6.0平台Visual C+ 6.0,是微软推出的一款C+编译器,把“高级语言”译为“机器语言”的程序。Microsoft Visual C+是Microsoft公司推出的以C+语言为基础的开发Windows环境程序,面向对象的可视化集成编程系统3。它不仅具有程序框架的自动生成、灵活便捷的类管理、代码编程和界面设计的集成交互与操作、可开发出多种程序等优点。Visual C+是一个功能非常大可视化的软件开发工具。自1993年Microsoft公司推出Visual C+1.0后,不断更新和掩替,Visual C+已成为了程序员进行软件时开发的首选工具。虽然微软公司推出了 Visual C+.NET(Visual C+7.0),但它的应用的很大的局限性,只适用于Windows 2000、Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C+6.0为平台。Visual C+6.0不仅是一个C+编译器,还是一个基于Windows操作系统的可视化集成开发环境4。主要部分:1、Developer Studio,这是一个集成开发环境,就是说利用它可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。我们日常工作的99%都是在它上面完成的,我们也知道,Developer Studio并不是专门用于VC的,它也同样用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio当成Visual C+, 它充其量只是Visual C+的一个壳子而已。2、 MFC(Microsoft Foundation Classes),是微软公司提供的一个类库(class libraries),以C+类的形式封装了Windows的API,并且还包含了一个应用程序框架,以减少应用程序开发人员的工作量。MFC是WinAPI与C+的结合。API,即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身。可以允许用户使用各种各样的第三方的编程语言来进行对Windows下应用程序的开发,使这些被开发出来的应用程序能在Windows下运行,比如VB、VC+、Java、Delhpi。编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在Windows的消息机制和绘图里,遵守Windows作为一个操作系统的内部实现,这其实也是一种必要。微软如果不提供API,这个世上对Windows编程的工作就不会存在5。其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。从理论上来讲,MFC也不是专用于Visual C+,Borland C+,C+Builder和Symantec C+同样可以处理MFC。同时,用Visual C+编写代码也并不意味着一定要用MFC,只要愿意,用Visual C+来编写SDK程序,或者使用STL、ATL,一样没有限制。不过,Visual C+本来就是为MFC打造的,Visual C+中的许多特征和语言扩展也是为MFC而设计的,所以用Visual C+而不用MFC就等于抛弃了Visual C+中很大的一部分功能。但是,Visual C+也不等于MFC。3、Platform SDK。软件开发的工具包(Software Development Kit)一般都是一些软件工程师为特定软件包、软件逻辑框架、硬件操作平台、操作系统等建立应用软件时的开发工具的集合。在广义上指辅助开发某一类软件的相关文档、范例和工具等的集合。1.3.2 开发语言C+底层开发最适合使用的是C语言,其与运行速度密不可分。运行在底层的程序要有很高的效率,C语言对于内存的处理具有这个能力。其中Winsock可以进行网络通信的编写,从而实现网络电话通话的功能。1.3.3Winsock从1991年的1.0版到1995年的2.0.8版,经过不断完善并在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成为Windows网络编程的事实上的标准。以U.C. Berkeley大学BSD UNIX中流行的Socket接口为范例定义了一套Microsoft Windows下网络编程接口。它不仅包含了人们所熟悉的Berkeley Socket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。Windows Sockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。此外,在一个特定版本Windows的基础上,Windows Sockets也定义了一个二进制接口(ABI),以此来保证应用Windows Sockets API的应用程序能够在任何网络软件供应商的符合Windows Sockets协议的实现上工作。因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。遵守这套Windows Sockets规范的网络软件,我们称之为Windows Sockets兼容的,而Windows Sockets兼容实现的提供者,我们称之为Windows Sockets提供者6。一个互联网软件的供应商必须能够百分之百的实现Windows Sockets规范才可以做到Windows Sockets兼容。任何能够和Windows Sockets兼容实现协同与一起工作的应用程序就被认为是具有Windows Sockets接口。我们把这种应用程序为Windows Sockets应用程序。Windows Sockets规范定义而且记录了怎样使用API与Internet协议族连接。通信的基础是套接口(Socket),一个这样的套接口是通讯的一端。在这一端上你可以找到与其对应的一个名字。一个正在被使用的套接口都有它的类型和与其相关的进程。套接口存在于通讯域中。通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。Windows Sockets规范支持单一的通讯域,即Internet域。各种进程使用这个域互相之间用Internet协议族来进行通讯。可分为流套接口和数据报套接口。流套接口提供了双向的,有序的,无重复并且无记录边界的数据流服务。数据报套接口支持双向的数据流,但并不保证是可靠,有序,无重复的。也就是说,一个从数据报套接口接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。数据报套接口的一个重要特点是它保留了记录边界。对于这一特点,数据报套接口采用了与现在许多包交换网络非常类似的模型7。1.4实现方式 PC to PC:通常而言,这种方式适合那些拥有声卡需要为全双工的,配备有麦克风的多媒体笔记本电脑同时可以连接上互联网的用户,通话的必要条件是双方电脑中一定安装有相同的网络电话软件。这样的网络上点对点式的通话模式,是voip电话应用和产生的雏形,它的好处是相当地方便和经济,但缺点呢也是很显而易见的,即通话的双方必须事先约定时间同时上网,而这在普通的商务领域中就显得相当麻烦,因此这种方式不能商用化或进入公众通信领域。要在计算机与计算机在因特网上打电话的过程包括以下5个实现步骤:1、首先,通过本地机的声卡将声音信息记录下来;2、使用软件将声音文件转化为一种压缩的数据文件;3、通过网络将数据文件传送到接听电话的一方;4、对方软件将数据文件还原为声音文件;5、通过对方声卡将声音播放出来。Phone to Phone:这种方式即“电话拨电话”,需要IP网络电话系统的支持。普通电话用户通过本地电话拨号连接到本地的IP电话网管,输入账号、密码,确认后输入被叫号码,由本地IP电话网关连接最靠近被叫号码的IP电话网关,然后再由该网管通过当地的电话网联通被叫号码用户,从而完成电话通信。2 VoIP的概述2.1 网络电话技术原理的分析及实现2.1.1 网络电话原理 网络电话通过把语音信号经过数字化处理、压缩编码打包、经过网络传输、然后解压、把数字信号还原成声音,让通话对方听到。语音从源端到达目的端的基本过程如下:声电转换:通过压电陶瓷等相似装置把声波转换为电信号。量化采样:将模拟的电信号按照某一种采样方法(比如脉冲编码调制,即PCM)转换成数字信号。封包:将一定的时长数字化以后的语音信号组合成为一帧,随后,按照国际电联(ITU-T)的标准,这些话音帧被封装到一个RTP报文中,并被进一步封装到UDP报文和IP报文中9。传输:IP报文在IP网络从源端传送到目的端 。去抖动:去除因封包在网络中传输速度不均匀所造成的抖动音、拆包、电声转换。一个完整的、可以大规模商用运营的IP电话系统包括如下一些技术:寻址语音编码与解码、回声消除和回声抑制、传输IP报文时延控制功能8。2.1.2网络基础知识如果用户要进行VC网络编程,就必须首先了解计算机网络通信的基本框架和工作原理。在两台或多台计算机之间进行网络通信时,通信的双方还必须遵循相同的通信原则和数据格式。接下来将首先向读者介绍OSI七层网络模型、TCP/IP协议以及C/S编程模型9。(1)OSI七层网络模型OSI网络模型是一个开放式系统互联的参考模型。通过这个参考模型,用户可以非常直观地了解网络通信的基本过程和原理。OSI参考模型如图2.1所示。图2.1 OSI七层网络参考模型从如图2.1所示的OSI网络模型中可以看到网络数据从发送方到达接收方的过程中数据的流向以及经过的通信层和相应的通信协议。事实上,在网络通信的发送端,其通信数据每到一个通信层,都会被该层协议在数据中添加一个包头数据。而在接收方恰好相反,数据通过每一层时,都会被该层协议剥去相应的包头数据。用户也可以这样理解即网络模型中的各层都是对等通信的10。在OSI七层网络模型中,各个网络层都具有各自的功能,如表2.1所示。协议层名功能概述物理硬件层数据链路层网络层数据传输层会话层表示层应用层表示计算机网络中的物理设备。常见的有计算机网卡等将传输数据进行压缩与解压缩将传输数据进行网络传输进行信息的网络传输建立物理网络的连接将传输数据以某种格式进行表示应用程序接口表2.1 各网络层的功能(2)TCP/IP协议以及UDP协议图2.2 TCP/IP参考模型TCP/IP是一组用于实现网络互连的通信协议。Internet网络体系结构TCP/IP为核心。基于TCP/IP的参考模型将协议分成四个层次,它们分别是:网络访问层、网际互联层、传输层(主机到主机)、和应用层。1. 应用层应用层(Application layer)是七层OSI模型的第七层。应用层直接和应用程序接口并提供常见的网络应用服务,应用层也向表示层发出请求。应用层指的是开放系统的最高层,是直接为应用进程提供服务的。其次作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务。其服务元素分为两类:公共应用服务元素CASE和特定应用服务元素SASE。2. 传输层传输层(Transport Layer)是OSI中最重要, 最关键的一层,是唯一负责总体的数据传输和数据控制的一层。传输层提供端到端的交换数据的机制,传输层对会话层等高三层提供可靠的传输服务,对网络层提供可靠的目的地站点信息。它的任务是根据通信子网的特性,最佳的利用网络资源,为两个端系统的会话层之间,提供建立、维护和取消传输连接的功能,负责端到端的可靠数据传输。在这一层,信息传送的协议数据单元称为段或报文。传输层也称为运输层,传输层只存在于端开放系统中,是介于低3层通信子网系统和高3层之间的一层,但是很重要的一层。因为它是源端到目的端对数据传送进行控制从低到高的最后一层。为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。该层定义了两个主要的协议:传输控制协议(TCP)和用户数据报协议(UDP)。TCP协议提供的是一种可靠的、通过“三次握手”来连接的数据传输服务;而UDP协议提供的则是不保证可靠的(并不是不可靠)、无连接的数据传输服务。TCP面向链接,发送的是报文段或段, TCP发送一个段后,启动一个定时器,等待目的端确认收到这个段,如果不能及时收到,将重发 当TCP收到打字TCP链接的另一端数据,将发送一个确认,通常会延迟几分之一秒发送。TCP将保持他的首部校验和。目的是检测数据有没有问题,如果有问题将丢弃,发送端超时重发。TCP和UDP是两种最为著名的传输协议,两者都使用IP作为网络层协议。TCP建立在IP协议提供的面向非连接、不可靠的数据投递服务基础上,但是TCP的传输层服务确实可靠的,TCP为应用程序发送和接收数据报。和TCP不同,UDP是不可靠的,不能保证数据报能安全无误的到达目的主机。由于TCP传输前会进行三次握手,所以TCP在数据传输的即时性上不如UDP。域名系统、TFTP(简单文件传输协议)、BOOTP(引导程序协议)、SNMP等都是使用UDP的应用程序。TCP协议是基于面向连接的可靠的通信协议,它具有重发机制,即当数据被破坏或者丢失时,发送方将重发该数据。而UDP协议是基于用户数据报协议,属于不可靠连接通信的协议。例如当使用UDP协议发送一条消息时,并不知道该消息是否已经到达接收方,或者在传输过程中数据是否已经丢失。但是在即时通信中,UDP协议在一些对时间要求较高的网络数据传输方面有着重要的作用。UDP是UserDatagramProtocol的简称,是OSI(OpenSystemInterconnection,开放式的系统互联)参考模型里的一种无连接地传输层的协议,提供的是面向事务、简单、不可靠的信息传送传递服务,IETFRFC768是UDP的正式规范。它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序。UDP提供了无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责。不可靠的意思是它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。如果发生某种错误时,如某个路由器暂时用完了缓冲区,IP有一个简单的错误处理算法:丢弃该数据报,然后发送ICMP消息报给信源端。任何要求的可靠性必须由上层来提供(如TCP)。无连接这个术语的意思是IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。这也说明,IP数据报可以不按发送顺序接收。如果一信源向相同的信宿发送两个连续的数据报(先是A,然后是B),每个数据报都是独立地进行路由选择,可能选择不同的路线,因此B可能在A到达之前先到达。常用的UDP端口号有:应用协议 端口号DNS 53TFTP 69SNMP 161UDP报文没有可靠性保证、顺序保证和流量控制字段等,可靠性较差。但是正因为UDP协议的控制选项较少,在数据传输过程中延迟小、数据传输效率高,适合对可靠性要求不高的应用程序,或者可以保障可靠性的应用程序,如DNS、TFTP、SNMP等。3.网络层网络层又称为网际互联层对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。注重重新赋予主机一个IP地址来完成对主机的寻址,它还负责数据包在多种网络中的路由。该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)和互联网控制报文协议(ICMP)11。IP协议是网际互联层最重要的协议,它提供的是一个可靠、无连接的数据报传递服务。 4.数据链路层(网络接入层)数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务的基础上向网络层提供服务。(3)C/S编程模型C/S编程模型是基于可靠连接的通信模型。在通信的双方必须使用各自的IP地址以及端口进行通信。否则,通信过程将无法实现。通常情况下,当用户使用C/S模型进行通信时,其通信的任意一方称为客户端,则另一方称为服务器端12。服务器端首先等待客户端连接请求的到来,这个过程称之为监听的过程。通常,服务器的监听功能是在特定IP地址和端口上进行。然后,客户端再向服务器发出连接请求,若服务器去响应该请求则会连接成功。否则的话,客户端连接就请求失败。C/S编程模型如图2.3所示。图2.3 C/S编程模型由于客户端连接服务器时需要使用服务器的IP地址和监听端口号才能完成连接,所以,服务器的IP地址和端口必须是固定的。在这里,向用户介绍部分协议所使用的端口号码。例如,HTTP协议(用于网页浏览服务)所使用的端口号为80,FTP协议(用于文件传输)所使用的端口号是21。2.1.3 网络编程基础可以使用MFC中封装的套接字类来编写网络应用程序,也可以使用Windows API函数进行程序开发。其中MFC网络编程比较简单,使用起来也非常方便。但是,使用MFC相关类编程会使用户对网络通信中的基本原理缺乏清晰的认识。而使用Windows API函数则恰好相反,可以使用户熟悉网络通信的基本原理。在实际编程过程中,通信双方的连接以及数据通信均是基于Socket(套接字)进行的。(1)Sockets套接字用户在Windows中编写网络通信程序时,需要使用Windows Sockets(Windows套接字)。与Windows套接字相关的API函数称为Winsock函数。在网络通信的双方,均有各自的套接字,并且该套接字与特定的IP地址和端口号相关联。流式套接字专门用于使用TCP协议通信的应用程序中,而数据报套接字则专门用于使用UDP协议进行通信的应用程序中。(2)网络字节顺序网络字节顺序是指TCP/IP协议中规定的数据传输使用格式,与之相对的字节顺序是主机字节顺序。网络字节顺序表示首先将数据中最重要的字节进行存储。因为通信数据可能会在不同的机器之间进行传输,所以通信数据必须以相同的格式进行整理。只有经过格式处理的通信数据,才能在不同的机器之间进行传输。2.1.4 网络通信基本流程要通过互联网进行通信,用户至少需要用到一组套接字,其中一个是运行在客户机端,我们称之为ClientSocket,另一个是运行在服务器端,我们称它为ServerSocket。根据网络通信的特点,套接字大致可分成两类:流式套接字与数据报的套接字。套接字之间的连接过程可以分为三个步骤,分别是服务器监听、客户端请求和连接确认13。具体说明如图2.4所示。图 2.4 套接字之间的连接过程2.1.5 搭建开发环境在Visual C+ 6.0环境下进行Winsock的API编程开发,需要在项目中导入以下三个文件,否则会发生编译错误。WINSOCK.h:WINSOCK API的头文件,需要包含在项目中。WSOCK32.lib:WINSOCK API链接库文件,使用时一定要把它作为项目的非默认的链接库包含到项目文件中去。WINSOCK.dll:WINSOCK的动态链接库,位于Windows的安装目录下。2.1.6 套接字套接字是网络通信过程中端点的抽象表示,在实现中以句柄的形式创建,包含了进行网络通信所必需的5种信息:连接使用的协议、本地主机的IP地址、本地进程的协议端口、远程主机的IP地址和远程进程的协议端口。来自客户的是UDP数据报。IP首部包含源端和目的端IP地址,UDP首部包含了源端和目的端的UDP端口号。当一个应用程序接收到UDP数据报时,操作系统必须告诉它是谁发送了这份消息,即源端IP地址与端口号。这个特性允许一个交互UDP服务器对多个客户进行处理。给每个发送请求的客户发回应答。套接字,是支持TCP/IP之间网络通信的一个基本的操作单元,其看做是不同主机的进程进行双向通信的端点,简单的而言他就是通信两方事先一种约定,用套接字里相关函数去完成整个通信过程。可以使用MFC中封装的套接字类来编写网络应用程序,也可以使用Windows API函数进行程序开发。其中MFC网络编程比较简单,使用起来也非常方便。但是,使用MFC相关类编程会使用户对网络通信中的基本原理缺乏清晰的认识。而使用Windows API函数则恰好相反,可以使用户熟悉网络通信的基本原理。在实际编程过程中,通信双方的连接以及数据通信均是基于Socket(套接字)进行的。 在网络通信的双方,都分别有各自的套接字,并且该套接字与特定的IP地址和端口号相关联。通常来说,套接字主要有两种类型,分别是流式套接字(SOCK_STREAM)和数据报的套接字(SOCK_DGRAM)。其中,流式套接字专门用于使用TCP协议通信的应用程序中,而数据报的套接字则专门用于使用UDP协议进行通信的应用程序中。流套接字是用于提供的面向连接、可靠数据和传输服务。该服务能保证数据可以实现它们无差错、无重复的发送,并按顺序接收。流套接字能够实现稳定的数据服务,原因就在于其采用了传输的控制协议,即TCP协议。 而Socket可以看成是在两个程序中进行的通讯连接的一个端点,它是用来连接应用程序与网络驱动程序的桥梁,Socket从应用程序里创建,通过绑定与网络驱动建立一定关系。然后,该应用程序发送给Socket的数据,由Socket交给网络的驱动程序,由它的网络上再发送出去。计算机从该网络上接收到了与该Socket绑定IP地址和端口号以及相关数据后,再由网络驱动程序去交给Socket,应用程序便可以从该Socket中提取接收到的数据,网络应用程序就是用这样的方式,通过Socket进行数据发送与接收的。WinSock编程中常用的数据结构有sockaddr_in和in_addr。(1)sockaddr_in结构WinSock通过sockaddr_in结构对有关Socket的信息进行了封装:struct sockaddr_in short sin_family;unsigned short sin_port;IN_ADDR sin_addr;char sin_zero8;上述结构中各个参数的具体说明如下。sin_family:指网络中标识不同设备时使用的地址类型,对于IP地址,它的类型是AF_INET。sin_port:指Socket对应的端口号。sin_addr:是一个结构,将IP进行了封装。sin_zero:一个用来填充结构的数组,字符全为0,这个结构对于不同地址类型可以是相同的大小。(2)in_addr结构in_addr结构对IP地址进行了封装,既可以用4个单字节数表示,也可以转换为两个双字节数表示或一个四字节数表示。这样定义是为了方便使用,例如在程序中初始化IP时,可以传入4个单字节整数,而在函数间传递这个值时,可以将其转换成一个四字节整数使用。in_addr结构定义如下:struct in_addr union struct u_char s_b1, s_b2, s_b3, s_b4; S_un_b;struct u_short s_w1, s_w2; S_un_w;u_long S_addr; S_un;2.1.7 套接字相关类在MFC类库中,几乎封装了Windows Sockets的全部功能。在接下来的内容中,将简单介绍两个最常用的套接字相关类CAsyncSocket类和CSocket类。(1)CAsyncSocket类在微软基础类库中,CAsyncSocket类封装了异步套接字的基本功能。用户通过使用该类来进行网络的数据与传输步骤如下。调用创建构造函数和创建套接字的对象。创建服务器端的套接字,则调用函数Bind()绑定本地IP和端口,然后调用函数Listen()监听客户端之间的请求。如果请求能到来,则调用函数Accept()响应该个请求。如果创建客户端套接字,则直接调用函数Connect()连接服务器即可。调用Send()等功能函数进行数据传输与处理。关闭或销毁套接字对象。(2)CSocket类CSocket类派生于CAsyncSocket类。该类不但具有CAsyncSocket类的基本功能,还具有序列化功能。用户在实际编程中,通过将CSocket类与CSocketFile类和CArchive类一起使用,能够很好地管理数据以及发送数据。用户通过使用该类来进行网络编程的步骤如下。创建CSocket类对象。如果创建服务器端的套接字,则调用函数Bind()绑定本地IP和端口,再调用函数Listen()监听客户端的请求。若请求到来,则调用函数Accept()响应该请求。如果创建这个客户端的套接字,则直接调用函数Connect()连接上服务器即可。创建与CSocket类对象相关联的CSocketFile类对象。创建与CSocketFile类相关联的CArchive对象。使用CArchive类对象在客户端和服务器之间进行数据传输。关闭或销毁CSocket类、CSocketFile类和CArchive类的3个对象。3网络电话系统软件模块的实现3.1网络通信(1)在文件SocketServer.cpp中实现接受类CSocketServer的具体功能。首先引用公共文件,然后定义类CSocketServer,具体代码如下:/ SocketServer.cpp : implementation file#include stdafx.h#include NetPhone.h#include SocketServer.h#include NetPhoneDlg.h#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif#define WM_NC 1001extern CSocketServer Socket_Server;extern CSocketServer Socket_Listen;extern CNetPhoneDlg *pDlg;extern BOOL bBtnConnectDown;extern BOOL bServerState;extern BOOL bClientState;extern BOOL bDisconnectState;extern BOOL bMiniState;extern CString sRemoteIP;extern CString sAck;externchar cAck15;/ CSocketServerCSocketServer:CSocketServer()CSocketServer:CSocketServer()Close();/ Do not edit the following lines, which are needed by ClassWizard.#if 0BEGIN_MESSAGE_MAP(CSocketServer, CAsyncSocket)/AFX_MSG_MAP(CSocketServer)/AFX_MSG_MAPEND_MESSAGE_MAP()#endif/ 0/ FD_ACCEPT网络事件处理函数,收到连接请求时发生void CSocketServer:OnAccept(int nErrorCode) / Socket_Server套接字接受连接请求Accept(Socket_Server);/ 错误信息处理if (0 != nErrorCode) switch( nErrorCode) /nErrorCode 为错误码 case WSANOTINITIALISED: AfxMessageBox(A successful AfxSocketInit must occur before using this API.n); break; case WSAENETDOWN: AfxMessageBox(The Windows Sockets implementation detected that the network subsystem failed.n); break; case WSAEFAULT: AfxMessageBox(The lpSockAddrLen argument is too small.n); break; case WSAEINPROGRESS: AfxMessageBox(A blocking Windows Sockets call is in progress.n); break; case WSAEINVAL: AfxMessageBox(Listen was not invoked prior to accept.n); break; case WSAEMFILE: AfxMessageBox(The queue is empty upon entry to accept and there are no descriptors available.n); break; case WSAENOBUFS: AfxMessageBox(No buffer space is available.n); break; case WSAENOTSOCK: AfxMessageBox(The descriptor is not a socket.n); break; case WSAEOPNOTSUPP: AfxMessageBox(

温馨提示

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

评论

0/150

提交评论