网络电话软件设计论文内容摘要:

个与之相连的进程 . 套接字存在通信区域 (通信区域又称地址簇 )中 . 套接字只与同一区域中的套接交换数据 (跨区域时 ,需要执行某些转换进程才能实现 ).Windows 中的套接字只支持一个域 ______网际域 .套接字具有类型 ,Windows Socket 版本支持两种套接字 :流套接字 (SOCK_STREAM)和数据报套接字 (SOCK_DGRAM). 9 Socket 通信实现原理 TCP/IP 协议的核心部分是传输层协议 (TCP,UDP),网络层协议 (IP)和物理接口层 ,这 三层通常是在操作系统内核中实现 .因此用户一般不涉及 .编程时 ,编程界面有两种形式 :一种形式是由内核心直接提供的系统调用 :另一种形式是使用以库函数方式提供的各种函数 .前者为核内实现 ,Socket 与 TCP/IP 协议的关系如图所示 . Socket 与 TCP/IP 协议关系 在 TCP/IP网络中两个进程间的相互作用的主机模式是客户机 /服务器模式 (Client/Server model).该模式的建立基于以下两点 :一点是非对等作用。 另外一点是通信完全是异步的 .客 户机 /服务吕模式 在操作过程中采取的是主动请示方式 . 首先服务器要先启动 ,并根据请示提供相应服务 ,过程如下所述 . (1)打开一通信通道并告知本地主机 ,它愿意在某一个公认地址上接收客户请求 . (2)等待客户请求到达端口 . (3) 接收到重复服务请求 ,处理该请求并发送应答信号 . (4) 返回第二步 ,等待另一客户请求 . (5)关闭服务器 . 客户方 : 打开一通信通道 ,并连接到服务器所在主机的特定端口 . 向服务器发送服务请求报文 ,等待并接收应答。 继续提出请求 …… 请求结束后关闭通信通道并终止 . 在 MFC 中 ,Microsoft 为套接口提供了相应的类 CAsyncSocket 和 应用程序 1 应用程序 2 网络应用编程界面 (SOCKET) TCP/IP 核心协议 物理介质 10 提供基于异步通信的套接口封装功能 ,Csocket则是由 CasyncSocket派生 ,提供更加高层次的功能 .例如可以将套接口上发送和接收的数据和一个文件对象 (CSocketFile)关联起来 ,通过读写文件来达到发送和接收数据的目的 ,此外 Csocket提供的通信为同步通信 ,数据未接收到或是未发送完之前调用不会返回 .与此同时 ,通过 MFC 类开发者可以不考虑网络字节顺序和忽略掉更多的通信细节 . 在一次网络通信 /连接中有以下 几个参数需要设置 : 本地 IP 地址 本地端口号 对方端口号 对方 IP 地址 左边两部分称为一个半关联 ,当与右边两部分建立连接后就称为一个全关联 .在这个全关联的套接口上可以双向交换数据 .如果是使用无连接的通信则只需要建立一个半关联 ,在发送和接收时指明另一半的参数就可以了 , 所以可以说无连接的通信是将数据发送到另一台主机的指定端口 .此外不论有连接还是无连接的通信都不需要双方的端口号相同 . 11 第四章 语音通讯介绍 语音通信的原理 要实现点对点语音通信,原理非常简单,只要针对一个点实现话音的 实时采集、处理、播放,同时能进行可靠的传送和接收,这样两点一连便可通话。 对于前者,采用 Windows MDK的低层音频服务比较合适,因为低层音频服务中的回调机制为我们提供了很大的方便。 当应用程序不断向设备驱动程序提供音频数据时,设备驱动程序控制音频设备在后台完成录音和放音的具体操作,通过回调机制,我们又可以检测到什么时候用完一个数据块,并及时传送下一个数据块,从而保证了声音的连续,有了这种单机上的实时采集、回放功能后,接下来的工作就是在网络上传送话音数据。 在点对点网络传输方面,选择面向连接的 TCP协议, TCP 传输协议自动处理分组丢失和交付失序问题,这样我们不用为这些问题操心,只需很好地利用这个连接,在采集话音回放之前一方面将自己的话音传给网络,另一方面接收网络传来的话音,这样便实现了点对点语音通信。 其结构框图如下: 声音的采集和播放都是在操作这个 typedef struct wavehdr_tag { LPSTR lpData。 /* pointer to locked data buffer */ DWORD dwBufferLength。 /* length of data buffer */ DWORD dwBytesRecorded。 /* used for input only */ DWORD dwUser。 /* for client39。 s use */ DWORD dwFlags。 /* assorted flags (see defines) */ DWORD dwLoops。 /* loop control counter */ struct wavehdr_tag FAR *lpNext。 /* reserved for driver */ DWORD reserved。 /* reserved for driver */ 12 } WAVEHDR, *PWAVEHDR, NEAR *NPWAVEHDR, FAR *LPWAVEHDR。 音频数据块结构,实际上主要用到的就是第一个成员变量 lpData, 所以我们只要在分配缓冲区(内存)的同时相应分配 WAVEHDR 数据块结构,然后将缓冲区的指针赋给对应的数据块结构的成员变量 lpData,这样当一个缓冲区填满后,也就是一个音频数据块填满了,通过消息机制就可以在消息函数中进行处理和播放,播放完后又可通过消息函数把缓冲区再送给音频设备输入驱动程 序,继续进行采集并播放,当你一次性分配多个缓冲区和数据块结构并赋给音频设备输入驱动程序后,至于把哪个缓冲区填满,然后再把哪个空缓冲区赋给设备输入驱动程序,不需人为干预,完全由 Windows 控制,这就是一种用动态循环缓冲区实现话音的实时采集、播放的简单而巧妙的办法。 对于声音的传送和接收主要是采用面向连接的 TCP 协议,并用 Windows Socket 进行网络编程实现,但首先要将发送和接收的函数接口放在 OnMmWimData(...)函数中,这样才能做到采集数据块填满后被发送,接收的数据收到后被播放。 Windows Socket 对于从事过网络编程的人来说应该不陌生,因为我们要实现点对点通信,所以得把客户和服务器模式融合为一种模式,让服务器可以做客户,客户也可以做服务器,从而使双方都有呼叫对方和接受对方呼叫的能力,这只需增加一个监听 Socket 就行了。 一旦呼叫连接建立成功,便在两个点之间建立了一个数据流,即使双方不讲话,每个点也在不停地收、发数据,一方有话音自然就随着这个数据流传给了对方,所以关键的问题就是怎样读取话音数据流,因为 TCP 提供的流式服务是不保证边界的,当发送方想一次发送 4000 个字节时,调 用语句 Send(sBuffer,4000),并不能保证一定能发送出 4000 个字节;同样,接收方准备一次接收发过来的数据,调用语句 Receive(rBuffer,4000),也不能保证一定能接收 4000 个字节,因此实际一次发送和接收的字节数会是 1 到 4000 中的任何一个值,最坏的情况是只有 1 个字节。 相反,如果用 Send 函数连续发送少量数据,比如一次发送 400 个字节,连续发送 10次,接收方用 Receive 函数可能一次就把这 4000 个字节都接收下来了,而为了实现播放,我们希望调用一次发送函数就能把缓冲区大小的话音数据发送出去,调 用一次接收函数就能把对方一次发送的话音数据准确接收下来,以便进行播放,所以一种比较简单实用的办法,就是利用 TCP 协议发送数据时为每个数据包加个标志头。 语音数据的网络传输 ( 1)实现语音的采集和播放,就是在发话方将声音通过麦克风和声卡采集成语音数据,在接收方通过声卡和耳机播放出来。 13 ( 2)实现语音数据的压缩和解压缩,在发话方压缩采集的语音数据,在接收方解压缩。 ( 3)实现语音数据在网络上的传输。 ( 4)多用户之间的连接方式和控制。 ( 5)软件整体结构和交互界面的设计。 考虑到软件的核心功能是 传输语音,所以整个软件的设计应该围绕着语音传输来设计。 首先分析语音传输的过程,如图一是一个单向的语音传输过程。 发话方首先由声卡采集语音,将语音转换为数据,存入内存中,再通过 CPU 进行语音压缩算法的运算,将语音数据进行压缩,最后通过网卡将语音数据发送出去。 接收方通过网卡接收到语音数据,首先由 CPU 采用解压缩算法将语音数据进行解压缩,然后通过声卡将数据转换为语音,通过耳机播放。 此流程图实际上已经包含了上述问题中前三个问题的解答,当然这只是从理论上肯定了可行性,具体的实现后面还会进一步讨论。 多个用户之间的互相 连接通常可以采用两种方法,如图二和图三。 第一种方法是设置一个服务器,所有的客户机都连接到服务器上,通过服务器互相连接。 这种方法的好处是软件控制比较简单,用户的连接也比较方便,用户只需要知道服务器的 IP 地址就行了。 但缺点也很明显,它较适合于公司的商业性质的软件,普通人员没有资金去专门购买和设置一个服务器,也没有时间和精力去管理和维护服务器。 第二种方法是不要服务器,每两个用户之间都可以互相连接,只要知道对方的 IP 地址就可以去连接对方,同时别人只要知道你的 IP 地址,也可以与你连接,即每台计算机都既是服务器,又是客 户机。 采用这种方法的优缺点与第一种方法可以说是正好相反,不再赘述。 也有某些比较完善的软件对这两种方法都予以采用,用户可以自行选择其中一种方法与其它用户进行连接。 14 由以上分析,作者决定采用第二种方式进行计算机之间。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。