基于Visual C++的一个简单的网络电话系统.docx
《基于Visual C++的一个简单的网络电话系统.docx》由会员分享,可在线阅读,更多相关《基于Visual C++的一个简单的网络电话系统.docx(63页珍藏版)》请在冰豆网上搜索。
基于VisualC++的一个简单的网络电话系统
题目基于VisualC++的一个简单的网络电话系统
学生姓名张一冰学号**********
所在学院物理与电信工程学院
专业班级电子1201班
指导教师李菊叶
完成地点物电学院计算机信息处理实验室
2016年6月5日
毕业论文﹙设计﹚任务书
院(系)物电学院专业班级电子信息工程学生姓名 张一冰
一、毕业论文﹙设计﹚题目基于VisualC++的一个简单的网络电话系统
二、毕业论文﹙设计﹚工作自__2016__年_3_月10日起至_2016__年6月20日止
三、毕业论文﹙设计﹚进行地点:
物电学院计算机信息处理分室
四、毕业论文﹙设计﹚的内容要求:
网络电话,是用户通过互联网直接拨打对方的固定电话或手机,包括国内长途和国际长途,而且费用比用传统电话拨打便宜5到10倍。
为了节约通信成本。
本设计要求学生在VisualC++环境下开发一个简单网络电话系统,可实现PC与PC、PC与Phone、phone与phone的通话功能。
五、毕业论文﹙设计﹚应收集资料及参考文献:
[1]徐孝凯,张纪勇.C++面向对象程序设计:
VC++6.0运行环境[M].天津大学出版社2009.[2]汪晓平,钟军.VC++网络通信协议分析与应用实现[M].北京:
人民邮电出版社,2003.
[3]王艳平,张越.Windows网络与通信程序设计[M].北京:
人民邮电出版社,2006.[4]AndrewS.Tanenbau.计算机网络(第四版)[M].北京:
清华大学出版社,2004.
[5]谢希仁.计算机网络(第五版)[M].北京:
电子工业出版社,2012.
[6]朱桂英.张元亮VisualC++网络编程开发与实践[M].清华大学出版社.2013.
六、毕业论文﹙设计﹚的进度安排:
3月2日——3月29日:
查阅资料,完成初步设计方案和开题报告。
4月1日——4月26日:
根据网络电话系统的工作原理,给出设计方案,及软件流程图。
4月29日——5月24:
并在软件环境下进行运行调试,进一步完善系统功能,整理资料;
5月27日——6月7日:
撰写、修改毕业设计论文。
6月10日——6月15日:
打印论文准备并完成答辩。
指导教师签名系(教研室)主任签名
专业负责人签名批准日期
基于VisualC++的一个简单的网络电话系统
张一冰
(陕西理工学院物理与电信工程学院电子信息工程专业,2012级1班,陕西汉中723000)
指导教师:
李菊叶
[摘要]网络普及给人们的生活带来了巨大的变化,视频聊天、远程会议、远程监控等应用逐渐走进了人们的日常生活和商务应用中。
本文基于VisualC++所开发的一个网络电话系统,利用传输控制协议和互联网协议原理、winsock以及流式套接字来完成程序的设计,用电脑通过客户端程序实现通话功能。
在现实中众所周知,我们都了解电话通信需要花费一定的通信费用,因此开发这样的应用程序,可以很大地节约人们之间通信成本,方便交互与沟通,在未来也会得到更大的应用。
[关键字]网络电话;winsock;TCP/IP;socket
VisualC++basedonasimplenetworktelephonesystem
ZhangYibing
(ShaanxiInstituteofPhysicsandTelecommunicationEngineering,ElectronicandInformationEngineering,2012class1,Hanzhong,Shaanxi723000)
Tutor:
LiJuye
Abstract:
Internetpopularitytopeople'sliveshasbroughtgreatchanges,videochat,teleconferencing,remotemonitoringapplicationsgraduallyintopeople'sdailylifeandbusinessapplications.BasedonVisualC++developedanetworktelephonesystem,usingtheTransmissionControlProtocolandInternetProtocolprinciples,winsockandstreamsockettocompletethedesignprocess,toachieveacomputercallfunctionalitythroughtheclientprogram.Inrealityweallknow,weallknowittakesacertaintelephonecommunicationcommunicationcosts,sothedevelopmentofsuchapplications,cangreatlysavethecostofcommunicationbetweenpeople,tofacilitateinteractionandcommunicationinthefuturewillgetmoreapplications.
Keywords:
voip;winsock;TCP/IP;socket
1引言
网络电话是建立在网络技术和通信技术基础上的新业务,是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平台
VisualC++6.0,是微软推出的一款C++编译器,把“高级语言”译为“机器语言”的程序。
MicrosoftVisualC++是Microsoft公司推出的以C++语言为基础的开发Windows环境程序,面向对象的可视化集成编程系统[3]。
它不仅具有程序框架的自动生成、灵活便捷的类管理、代码编程和界面设计的集成交互与操作、可开发出多种程序等优点。
VisualC++是一个功能非常大可视化的软件开发工具。
自1993年Microsoft公司推出VisualC++1.0后,不断更新和掩替,VisualC++已成为了程序员进行软件时开发的首选工具。
虽然微软公司推出了VisualC++.NET(VisualC++7.0),但它的应用的很大的局限性,只适用于Windows2000、WindowsXP和WindowsNT4.0。
所以实际中,更多的是以VisualC++6.0为平台。
VisualC++6.0不仅是一个C++编译器,还是一个基于Windows操作系统的可视化集成开发环境[4]。
主要部分:
1、DeveloperStudio,这是一个集成开发环境,就是说利用它可以编辑,编译,调试,而不是使用多种工具轮换操作,灵活性较大。
我们日常工作的99%都是在它上面完成的,我们也知道,DeveloperStudio并不是专门用于VC的,它也同样用于VB,VJ,VID等VisualStudio家族的其他同胞兄弟。
所以不要把DeveloperStudio当成VisualC++,它充其量只是VisualC++的一个壳子而已。
2、MFC(MicrosoftFoundationClasses),是微软公司提供的一个类库(classlibraries),以C++类的形式封装了Windows的API,并且还包含了一个应用程序框架,以减少应用程序开发人员的工作量。
MFC是WinAPI与C++的结合。
API,即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身。
可以允许用户使用各种各样的第三方的编程语言来进行对Windows下应用程序的开发,使这些被开发出来的应用程序能在Windows下运行,比如VB、VC++、Java、Delhpi。
编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在Windows的消息机制和绘图里,遵守Windows作为一个操作系统的内部实现,这其实也是一种必要。
微软如果不提供API,这个世上对Windows编程的工作就不会存在[5]。
其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
从理论上来讲,MFC也不是专用于VisualC++,BorlandC++,C++Builder和SymantecC++同样可以处理MFC。
同时,用VisualC++编写代码也并不意味着一定要用MFC,只要愿意,用VisualC++来编写SDK程序,或者使用STL、ATL,一样没有限制。
不过,VisualC++本来就是为MFC打造的,VisualC++中的许多特征和语言扩展也是为MFC而设计的,所以用VisualC++而不用MFC就等于抛弃了VisualC++中很大的一部分功能。
但是,VisualC++也不等于MFC。
3、PlatformSDK。
软件开发的工具包(SoftwareDevelopmentKit)一般都是一些软件工程师为特定软件包、软件逻辑框架、硬件操作平台、操作系统等建立应用软件时的开发工具的集合。
在广义上指辅助开发某一类软件的相关文档、范例和工具等的集合。
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大学BSDUNIX中流行的Socket接口为范例定义了一套MicrosoftWindows下网络编程接口。
它不仅包含了人们所熟悉的BerkeleySocket风格的库函数;也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。
WindowsSockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。
此外,在一个特定版本Windows的基础上,WindowsSockets也定义了一个二进制接口(ABI),以此来保证应用WindowsSocketsAPI的应用程序能够在任何网络软件供应商的符合WindowsSockets协议的实现上工作。
因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。
遵守这套WindowsSockets规范的网络软件,我们称之为WindowsSockets兼容的,而WindowsSockets兼容实现的提供者,我们称之为WindowsSockets提供者[6]。
一个互联网软件的供应商必须能够百分之百的实现WindowsSockets规范才可以做到WindowsSockets兼容。
任何能够和WindowsSockets兼容实现协同与一起工作的应用程序就被认为是具有WindowsSockets接口。
我们把这种应用程序为WindowsSockets应用程序。
WindowsSockets规范定义而且记录了怎样使用API与Internet协议族连接。
通信的基础是套接口(Socket),一个这样的套接口是通讯的一端。
在这一端上你可以找到与其对应的一个名字。
一个正在被使用的套接口都有它的类型和与其相关的进程。
套接口存在于通讯域中。
通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。
套接口通常和同一个域中的套接口交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。
WindowsSockets规范支持单一的通讯域,即Internet域。
各种进程使用这个域互相之间用Internet协议族来进行通讯。
可分为流套接口和数据报套接口。
流套接口提供了双向的,有序的,无重复并且无记录边界的数据流服务。
数据报套接口支持双向的数据流,但并不保证是可靠,有序,无重复的。
也就是说,一个从数据报套接口接收信息的进程有可能发现信息重复了,或者和发出时的顺序不同。
数据报套接口的一个重要特点是它保留了记录边界。
对于这一特点,数据报套接口采用了与现在许多包交换网络非常类似的模型[7]。
1.4实现方式
PCtoPC:
通常而言,这种方式适合那些拥有声卡需要为全双工的,配备有麦克风的多媒体笔记本电脑同时可以连接上互联网的用户,通话的必要条件是双方电脑中一定安装有相同的网络电话软件。
这样的网络上点对点式的通话模式,是voip电话应用和产生的雏形,它的好处是相当地方便和经济,但缺点呢也是很显而易见的,即通话的双方必须事先约定时间同时上网,而这在普通的商务领域中就显得相当麻烦,因此这种方式不能商用化或进入公众通信领域。
要在计算机与计算机在因特网上打电话的过程包括以下5个实现步骤:
1、首先,通过本地机的声卡将声音信息记录下来;
2、使用软件将声音文件转化为一种压缩的数据文件;
3、通过网络将数据文件传送到接听电话的一方;
4、对方软件将数据文件还原为声音文件;
5、通过对方声卡将声音播放出来。
PhonetoPhone:
这种方式即“电话拨电话”,需要IP网络电话系统的支持。
普通电话用户通过本地电话拨号连接到本地的IP电话网管,输入账号、密码,确认后输入被叫号码,由本地IP电话网关连接最靠近被叫号码的IP电话网关,然后再由该网管通过当地的电话网联通被叫号码用户,从而完成电话通信。
2VoIP的概述
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.1OSI七层网络参考模型
从如图2.1所示的OSI网络模型中可以看到网络数据从发送方到达接收方的过程中数据的流向以及经过的通信层和相应的通信协议。
事实上,在网络通信的发送端,其通信数据每到一个通信层,都会被该层协议在数据中添加一个包头数据。
而在接收方恰好相反,数据通过每一层时,都会被该层协议剥去相应的包头数据。
用户也可以这样理解即网络模型中的各层都是对等通信的[10]。
在OSI七层网络模型中,各个网络层都具有各自的功能,如表2.1所示。
协议层名
功能概述
物理硬件层
数据链路层
网络层
数据传输层
会话层
表示层
应用层
表示计算机网络中的物理设备。
常见的有计算机网卡等
将传输数据进行压缩与解压缩
将传输数据进行网络传输
进行信息的网络传输
建立物理网络的连接
将传输数据以某种格式进行表示
应用程序接口
表2.1各网络层的功能
(2)TCP/IP协议以及UDP协议
图2.2TCP/IP参考模型
TCP/IP是一组用于实现网络互连的通信协议。
Internet网络体系结构TCP/IP为核心。
基于TCP/IP的参考模型将协议分成四个层次,它们分别是:
网络访问层、网际互联层、传输层(主机到主机)、和应用层。
1.应用层
应用层(Applicationlayer)是七层OSI模型的第七层。
应用层直接和应用程序接口并提供常见的网络应用服务,应用层也向表示层发出请求。
应用层指的是开放系统的最高层,是直接为应用进程提供服务的。
其次作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务。
其服务元素分为两类:
公共应用服务元素CASE和特定应用服务元素SASE。
2.传输层
传输层(TransportLayer)是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端口号有:
应用协议端口号
DNS53
TFTP69
SNMP161
UDP报文没有可靠性保证、顺序保证和流量控制字段等,