您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 局域网的语音通信系统论文
局域网的语音通信系统论文1.6万字+论文+开题报告+英文翻译+文献综述winsock编程原理在WINDOWS95/98,WINDOWSNT进行WINSOCK开发使用的编程语言有很多,VC++,JAVA,DELPHI,VB等。其中VC时使用最普遍,和WINSOCK结合最紧密的。并且VC++对原来的WindowsSockets库函数进行了一系列封装,继而产生了CAsynSocket、CSocket、CSocketFile等类,它们封装着有关Socket的各种功能,是编程变得更加简单。但如果你是一个WINSOCK编程的初学者,那么建议你在一开始还是学习WINSOCK最基本的API函数进行编程,这样可以大大加深对WINSOCK的了解,对将来很有好处。在VC中进行WINSOCK的API编程开发,需要使用到下面三个文件:1)WINSOCK.H:这是WINSOCKAPI的头文件;2)WSOCK32.LIB:WINSOCKAPI连接库文件。在使用中,一点要把它作为项目的非缺省的连接库包含到项目文件中去;3)WINSOCK.DLL:WINSOCK的动态连接库,位于WINDOWS的安装目录下。一般在使用中,面向连接协议的SOCKET编程模型应用最为广泛,因为面向连接协议提供了一系列的数据纠错功能,可以保证在网络上传输的数据及时、无误地到达对方。总的来说,使用SOCKET接口(面向连接或无连接)进行网络通信时,必须按下面简单的四步进行处理:程序必须建立一个SOCKET;程序必须按要求配置此SOCKET。也就是说,程序要么将此SOCKET连接到远方的主机上,要么给此SOCKET指定一个本地协议端口;程序必须按要求通过此SOCKET发送和接收数据;程序必须关闭此SOCKET。在MFC中MS为套接口提供了相应的类CAsyncSocket和CSocket,CAsyncSocket提供基于异步通信的套接口封装功能,CSocket则是由CAsyncSocket派生,提供更加高层次的功能,例如可以将套接口上发送和接收的数据和一个文件对象(CSocketFile)关联起来,通过读写文件来达到发送和接收数据的目的,此外CSocket提供的通信为同步通信,数据未接收到或是未发送完之前调用不会返回。此外通过MFC类开发者可以不考虑网络字节顺序和忽略掉更多的通信细节。创建CAsyncSocket对象,可以调用下列函数:A)BOOLCAsyncSocket::Create(UINTnSocketPort=0,intnSocketType=SOCK_STREAM,longlEvent=FD_READFD_WRITEFD_OOBFD_ACCEPTFD_CONNECTFD_CLOSE,LPCTSTRlpszSocketAddress=NULL)通过指明lEvent所包含的标记来确定需要异步处理的事件,对于指明的相关事件的相关函数调用都不需要等待完成后才返回,函数会马上返回然后在完成任务后发送事件通知,并利用重载以下成员函数来处理各种网络事件:标记事件需要重载的函数FD_READ有数据到达时发生voidOnReceive(intnErrorCode);FD_WRITE有数据发送时产生voidOnSend(intnErrorCode);FD_OOB收到外带数据时发生voidOnOutOfBandData(intnErrorCode);FD_ACCEPT作为服务端等待连接成功时发生voidOnAccept(intnErrorCode);FD_CONNECT作为客户端连接成功时发生voidOnConnect(intnErrorCode);FD_CLOSE套接口关闭时发生voidOnClose(intnErrorCode);我们看到重载的函数中都有一个参数nErrorCode,为零则表示正常完成,非零则表示错误。通过intCAsyncSocket::GetLastError()可以得到错误值。下面我们看看套接口类所提供的一些功能,通过这些功能我们可以方便的建立网络连接和发送数据。BOOLCAsyncSocket::Create(UINTnSocketPort=0,intnSocketType=SOCK_STREAM,longlEvent=FD_READFD_WRITEFD_OOBFD_ACCEPTFD_CONNECTFD_CLOSE,LPCTSTRlpszSocketAddress=NULL);用于创建一个本地套接口,其中nSocketPort为使用的端口号,为零则表示由系统自动选择,通常在客户端都使用这个选择。nSocketType为使用的协议族,SOCK_STREAM表明使用有连接的服务,SOCK_DGRAM表明使用无连接的数据报服务。lpszSocketAddress为本地的IP地址,可以使用点分法表示如10.1.1.3。BOOLCAsyncSocket::Bind(UINTnSocketPort,LPCTSTRlpszSocketAddress=NULL)作为等待连接方时产生一个网络半关联,或者是使用UDP协议时产生一个网络半关联。BOOLCAsyncSocket::Listen(intnConnectionBacklog=5)作为等待连接方时指明同时可以接受的连接数,请注意不是总共可以接受的连接数。BOOLCAsyncSocket::Accept(CAsyncSocket&rConnectedSocket,SOCKADDR*lpSockAddr=NULL,int*lpSockAddrLen=NULL)作为等待连接方将等待连接建立,当连接建立后一个新的套接口将被创建,该套接口将会被用于通信。BOOLCAsyncSocket::Connect(LPCTSTRlpszHostAddress,UINTnHostPort);作为连接方发起与等待连接方的连接,需要指明对方的IP地址和端口号。voidCAsyncSocket::Close()关闭套接口。intCAsyncSocket::Send(constvoid*lpBuf,intnBufLen,intnFlags=0)intCAsyncSocket::Receive(void*lpBuf,intnBufLen,intnFlags=0);在建立连接后发送和接收数据,nFlags为标记位,双方需要指明相同的标记。intCAsyncSocket::SendTo(constvoid*lpBuf,intnBufLen,UINTnHostPort,LPCTSTRlpszHostAddress=NULL,intnFlags=0)intCAsyncSocket::ReceiveFrom(void*lpBuf,intnBufLen,CString&rSocketAddress,UINT&rSocketPort,intnFlags=0);对于无连接通信发送和接收数据,需要指明对方的IP地址和端口号,nFlags为标记位,双方需要指明相同的标记。我们可以看到大多数的函数都返回一个布尔值表明是否成功。如果发生错误可以通过intCAsyncSocket::GetLastError()得到错误值。由于CSocket由CAsyncSocket派生所以拥有CAsyncSocket的所有功能,此外你可以通过BOOLCSocket::Create(UINTnSocketPort=0,intnSocketType=SOCK_STREAM,LPCTSTRlpszSocketAddress=NULL)来创建套接口,这样创建的套接口没有办法异步处理事件,所有的调用都必需完成后才会返回。由于Windows的基于消息的特点,WINSOCK和BSD套接口相比,有如下一些新的扩充:1)异步选择机制。异步选择函数WSAAsyncSelect()允许应用程序提名一个或多个感兴趣的网络事件,如FD_READ,FD_WRITE,FD_CONNECT,FD_ACCEPT等等代表的网络事件,当被提名的网络事件发生时,Windows应用程序的窗口函数将收到一个消息.这样就可以实现事件驱动了;2)异步请求函数。异步请求函数允许应用程序用异步方式获得请求的信息,如WSAAsyncGetXByY()类函数。这些函数是对BSD标准函数的扩充.函数WSACancelAsyncRequest()允许用户中止一个正在执行的异步请求;3)阻塞处理方法。WINSOCK提供了“钩子函数”负责处理Windows消息,使Windows的消息循环能够继续。WINSOCK提供了两个函数(WSASetBlockingHook()和WSAUnhookBlockingHook())让应用程序设置或取消自己的钩子函数.函数WSAIsBlocking()可以检测是否阻塞,函数WSACancelBlockingCall()可以取消一个阻塞的调用;4)错误处理。WINSOCK提供了两个WSAGetLastError()和WSASetLastError()来获取和设置最近错误号。5)启动和终止。由于WindowsSockets的服务是以动态连接库WINSOCKDLL形式实现的,所以必须要先调用WSAStartup()函数对WindowsSocketsDLL进行初始化,协商WINSOCK的版本支持,并分配必要的资源.在应用程序关闭套接口后,还应调用WSACleanup()终止对WindowsSocketsDLL的使用,并释放资源,以备下一次使用。在这些函数中,实现Windows网络实时通信的关键是异步选择函数WSAAsyncSelect()的使用。2.5系统实现的功能及设计要求2.5.1系统实现的功能本系统要求在MFC(VC++)环境下实现,要求能够实现基本的语音通信功能,具体功能为:1.实现实时的语音通信2.语音数据的发送和实时播放2.5.2设计要求(一)要求具备的基础知识:(1)熟悉MFC(VC++)编程环境(2)熟悉计算机网络协议(3)熟悉C/S结构(4)熟悉软件开发的基本流程(5)论文中要体现现在软件工程的设计方法,比如:UML方法的使用等。(二)开发环境(1)操作系统:Windows2000/XP/2003(2)编译环境:VisualC++6.0(三)程序需要的设计模块(1)负责接收连接的服务器Socket模块:负责该程序作为服务器时的网络端口监听。(2)负责接收/发送数据的客户端Socket模块:负责对Socket的发送数据和接收数据进行消息处理。(3)声卡数据的采集和播放模块:采用相关波形音频API,负责采集声音数据和播放声音数据。(4)主框架的参数设定、消息处理和界面控制模块:负责控制整个程序的操作,负责处理用户的输入参数,负责处理声卡消息和socket消息。第3章系统分析与设计3.1设计思想要实现点对点语音通信,原理非常简单,只要针对一个点实现话音的实时采集、处理、播放,同时能进行可靠的传送和接收,这样两点一连便可通话。对于前者,采用WindowsMDK的低层音频服务比较合适,因为低层音频服务中的回调机制为我们提供了很大的方便。当应用程序不断向设备驱动程序提供音频数据时,设备驱动程序控制音频设备在后台完成录音和放音的具体操作,通过回调机制,我们又可以检测到什么时候用完一个数据块,并及时传送下一个数据块,从而保证了声音的连续,有了这种单机上的实时采集、回放功能后,接下来的工作就是在网络上传送话音数据。在点对点网络传输方面,选择面向连接的TCP协议,TCP传输协议自动处理分组丢失和交付失序问题,这样我们不用为这些问题操心,只需很好地利用这个连接,在采集话音回放之前一方面将自己的话音传给网络,另一方面接收网络传来的话音,这样便实现了点对点语音通信。其结构框图如下:对于声音的传送和接收主要是采用面向连接的TCP协议,并用WindowsSocket进行网络编程实现,但首先要将发送和接收的函数接口放在OnMmWimData(...)函数中,这样才能做到采集数据块填满后被发送,接收的数据收到后被播放。WindowsSocket
本文标题:局域网的语音通信系统论文
链接地址:https://www.777doc.com/doc-316092 .html