版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 基于VC的語音傳輸系統的設計與開發(fā)</p><p><b> 摘 要</b></p><p> 隨著計算機應用技術的快速發(fā)展和日益普及,網絡也遍及到我們生活的每個角落,為我們的學習和工作帶來極大的方便。很多人都使用過傳統的文字輸入聊天方式,與之不同的另外一種聊天方式就是語音聊天。主要對那些不會使用鍵盤的老年用戶和追求時尚的年輕人,語音聊
2、天是一種非常好的聊天方式,它能增加聊天雙方的親切感和真實感,語音聊天就涉及到語音的傳輸。</p><p> 本系統主要討論了Windows系統下網絡語音的傳輸,尤其是對網絡編程做了較深入的學習和應用,并以語音聊天為例給出了應用實例。本系統主要利用Windows系統下的API函數和SOCKET函數以及VC開發(fā)平臺的強大功能來實現。經過半年多的努力,終于完成了語音傳輸系統的需求分析、模塊功能劃分、多媒體編程、服務器
3、-客戶端模型等。本系統可以實現網絡間文字、語音信息的傳輸。</p><p> 關鍵詞 信息傳輸;網絡編程;語音傳輸;多媒體</p><p> The design and development of voice transmission based on VC</p><p><b> Abstract</b></p>&
4、lt;p> The Internet is more and more popular in our lives because of the development of computer technology. Internet helps us in study and work. Many people use the traditional input method to chat, but there is a ne
5、w method that we can speak to our friends in real-time. Voice chatting is developed for ones who do not know how to type, or the young people, it can increase the realistic and friendliness. </p><p> This p
6、aper discusses the transmission of voice by network in windows operation system, such as voice chats. The system is programmed with API functions and Socket functions of the windows. After six months of effort, the voice
7、 chatting system was completed. This system includes requirements analysis, and functional modules, multimedia programming, server-client model. In network, the text and voice can be transported through this system . <
8、;/p><p> Key words: Information transmission; Network programming; Voice transmission; Multimedia</p><p> 目 錄 </p><p><b> 論文總頁數:19頁</b></p><p>
9、<b> 1引言1</b></p><p> 2語音傳輸系統需求分析1</p><p> 3開發(fā)工具與環(huán)境介紹2</p><p> 3.1Visual C++概述2</p><p> 3.1.1Visual C++簡介2</p><p> 3.1.2Visual
10、C++的發(fā)展過程2</p><p> 3.1.3Visual C++的特點3</p><p> 3.2Visual C++的集成開發(fā)環(huán)境3</p><p> 3.3Windows程序設計基礎4</p><p> 3.3.1概述4</p><p> 3.3.2消息處理函數4</p&g
11、t;<p> 3.3.3窗口的建立5</p><p> 3.3.4消息循環(huán)6</p><p> 4Windows網絡編程8</p><p> 4.1網絡和協議8</p><p> 4.2Winsock 接口9</p><p> 4.3服務器程序和客戶程序創(chuàng)建過程11&l
12、t;/p><p> 5語音傳輸系統功能實現13</p><p> 5.1語音模塊實現13</p><p> 5.2服務器和客戶端功能的實現14</p><p> 6系統功能的測試與分析15</p><p> 6.1語音聊天程序使用介紹15</p><p> 6.2測
13、試與分析16</p><p><b> 結 論16</b></p><p><b> 參考文獻17</b></p><p><b> 致 謝18</b></p><p><b> 聲 明19</b></p>
14、<p><b> 引言</b></p><p> 20世紀是計算機的世紀,計算機及相關技術的快速發(fā)展令人目不暇接。伴隨著計算機技術的發(fā)展,網絡的發(fā)展更加迅猛,令人不禁有“只有想不到,沒有做不到”之感。網絡已經成為最大的信息傳輸方式之一。在新的世紀里,我們更要掌握好計算機知識。隨著高新技術的不斷發(fā)展,計算機更新速度越來越快,計算機已經逐漸溶入人們的生活。很難想象沒有計算機的現代
15、社會將變成一個什么樣子。計算機已經和我們的生活息息相關。而可視化操作簡單的Microsoft Windows操作系統就越來越頻繁的出現在我們的工作學習中,給我們帶來了很多便利。隨著計算機的不斷發(fā)展,網絡技術也在不斷發(fā)展。現在我們通過網絡進行學習、討論、交流、游戲等等,網絡正逐漸成為我們身邊不可或缺的東西。那么要進行交流,語言、文字是不可缺少的。如何進行網絡間的語言文字交流?通過對Visual C++和Windows網絡編程技術的學習,本
16、系統研制出一個能夠進行網絡間語言文字交流的語音傳輸軟件。 </p><p> Visual C++是一種可視化的、面向對象的Windows開發(fā)語言,它具有易用、通用和開發(fā)效率高的特點。隨著微軟公司對他不斷的改進以及計算機本身在性能上的迅速提高,使得Visual C++越來越適合于一般的應用程序的開發(fā)。自從Visual C++ 6.0推出以來,已經為非常多的開發(fā)人員所使用,一直是當前最主流的開發(fā)工具之一。而Win
17、dows操作系統大家更是熟悉不過了。那么提到Windows編程就不能不提API。API是Application Programming Interface的簡寫,意思是應用程序編程接口??梢园阉胂蟪梢粋€程序庫,提供各式各樣與Windows系統服務有關的函數,例如CreateFile是用來創(chuàng)建文件的API函數,C的標準庫函數create也提供了創(chuàng)建文件的函數,但是他是靠調用CreateFile函數完成創(chuàng)建文件功能的。事實上,在Windo
18、ws下運行的程序最終都是通過調用API函數來完成創(chuàng)建工作的,因此,可以把Win32 API看成是最底層的服務。本文所介紹的網絡語音傳輸程序就是一個在Windows環(huán)境下以Visual C++為編程語言的應用程序。</p><p> 語音傳輸系統需求分析</p><p> 隨著現代計算機技術的不斷發(fā)展,多媒體已經成為現代計算機不可缺少的功能,而計算機的音頻,視頻功能是其中最為重要的部分。
19、而隨著網絡的不斷發(fā)展,網絡已經成為人們最重要的交流方式之一。計算機硬件的更新,特別是海量存儲設備和大容量內存在PC機上的實現,對音頻媒體進行數字化處理早已經成為可能。</p><p> 現在,企業(yè)、機關、學校都建立起了局域網。雖然可以通過文件共享的方式進行通訊,但單使用這種方式,非常不方便。在網上鄰居里,只能看到機器名,不清楚對方是誰,也不知道對方機器里有什么資源可以共享,尤其當局域網的機器很多時,這種方式就更
20、加麻煩了。而文字聊天方式比較單一缺乏真實感,所以語音通信就有了必要。但是語音傳輸需要有很大的網絡帶寬,對于撥號上網用戶,語音傳輸仍然是奢侈品,不過對于局域網和寬帶用戶來說,是很不錯的選擇,本系統就是研究的基于局域網的語音傳輸,并以語音聊天為例給出了實例。</p><p> 語音聊天方式一般有兩種,一種是專門的語音聊天室,采用Web方式,B/S結構,另外一中則是類似于QQ、MSN等聊天工具,采用C/S結構。本設計
21、是采用的后者。TCP/IP網絡中兩個進程間的相互作用的主機模式是客戶機/服務器模式(Client/Server model)。該模式的建立基于以下兩點:1、非對等作用;2、通信完全是異步的??蛻魴C/服務器模式在操作過程中采取的是主動請示方式,首先服務器方要先啟動,并根據請示提供相應服務。</p><p> 綜上所述,做一個語音通信軟件是有必要的,也是能夠實現的。</p><p><
22、b> 開發(fā)工具與環(huán)境介紹</b></p><p> Visual C++概述</p><p> Visual C++簡介</p><p> VC是Microsoft公司的重要殘品之一——Developer Studio工具集的重要組成部分。他用來在Windows(包括95、98、NT、2000、XP等)環(huán)境下開發(fā)應用程序,是一種功能強大、行
23、之有效的可視化編程工具。VC以可視化技術為基礎,以C++語言為藍本,以眾多的集成工具為骨架,在計算機領域的諸多方面都發(fā)揮著重要的作用。VC提供了簡潔實用的開發(fā)環(huán)境,集成的工具集能讓用戶高效率地開發(fā)應用程序。VC提供了MFC類庫,一般性的工作可以全部交給VC來完成,用戶只要在其基礎上做出自己想要實現的功能即可。VC完成目標所花費的時間要少得多。</p><p> Visual C++的發(fā)展過程</p>
24、<p> 作為一種C/C++語言的集成開發(fā)環(huán)境(IDE),產生VC的最早的根源其實要追溯到DOS時代的Borland公司,當初Borland公司開發(fā)的Turbo Pascal和Turbo C讓程序員們深刻感受到了把編輯器和編譯器集成在一起的IDE是多么的方便,微軟公司也看到了這一優(yōu)點,于是相繼開發(fā)了Quick C和Microsoft C/C++等多個DOS版本的C/C++集成開發(fā)工具。隨著Windows的不斷成熟,Mic
25、rosoft公司決定放棄DOS下的開發(fā)工作,正式推出Windows下的VC 1.0,早期的VC功能并不怎么強大,使用起來也不方便,1.0版和1.5版都是16位編程工具。VC的革命性改變得益于Windows95的推出,從VC2.0開始,微軟公司又放棄了16位編程,以后的VC都只用于32位編程開發(fā),為了與MFC類庫的版本號保持一致,微軟公司跳過了版本3,直接推出了VC4.0,這個版本及修訂版4.2的部分界面風格一直保留到VC6.0。從VC4
26、.0到VC6.0,VC的各種功能不斷增強,MFC類庫的內容也越來越豐富,現在利用VC開發(fā)應用程序已經是一種相對輕松的事情了。</p><p> Visual C++的特點</p><p> 在VC發(fā)展的同時,Borland公司也在不斷改進他的C/C++開發(fā)工具,并相繼推出了Borland C++和C++ Builder等產品,其實,現在的C++ Builder也是一個非常優(yōu)秀的開發(fā)工具
27、,但是基于下邊的幾點原因,我們可以看出VC有著不可比擬的優(yōu)越性:</p><p> 1 VC的核心——MFC類庫已經是事實上的行業(yè)標準,Borland自己開發(fā)的類庫也在向MFC看齊。</p><p> 2 VC與Visual Studio中的其他可視化開發(fā)工具緊密集成,可用于開發(fā)非常專業(yè)的應用程序。</p><p> 3 VC的聯機幫助已經被集成到MSDN庫中
28、去了,后者包含了微軟公司大部分產品的技術文檔和支持資料,內容相當豐富,是程序員不可多得的參考資料,現在MSDN庫隨著Visual Studio6.0一起發(fā)行,極大地方便了用戶。</p><p> Visual C++的集成開發(fā)環(huán)境</p><p> Visual Studio 6.0企業(yè)版一共有6張光盤,如果只安裝VC 6.0那么需要第一張光盤和MSDN庫。VC 6.0可以安裝在所有運
29、行Windows 95/98/NT/2000/XP等的系統上。安裝按提示完成后,開始菜單的程序中應生成Microsoft Visual Studio 6.0和Microsoft Developer Network兩個程序組。</p><p> 從Visual Studio 6.0的程序組中運行VC6.0,便可啟動VC6.0的開發(fā)環(huán)境——Developer Studio。每次運行VC6.0時,首先會彈出一個“Ti
30、p of the Day”的對話框,其中介紹有很多關于開發(fā)環(huán)境的使用方法以及編程調試方面的小技巧,如果不想看他,可以選擇在下一次啟動時不再顯示。</p><p> 如圖3-1所示,VC6.0的窗口被分成了幾部分,最上邊是標題條、菜單和工具欄,中間左邊的窗口是工作區(qū)窗口,右邊為文檔窗口,顯示正在編輯的文本文件(或資源),下方為輸出窗口和狀態(tài)欄。</p><p> 除了主菜單和工具欄外,V
31、C6.0開發(fā)環(huán)境還提供了大量的上下文關聯菜單,用鼠標右鍵單擊窗口中的很多地方都會彈出一個關聯菜單,此菜單包含與被單擊項目相關的各種命令,從而可以加快一些常規(guī)操作的速度。</p><p> VC啟動之后,窗口中幾乎一切都是空白的,所以我打開了一個工程。中文版的VC++ 6.0,其工作界面如下:</p><p> 圖3-1 VC主窗口</p><p> Windo
32、ws程序設計基礎</p><p><b> 概述</b></p><p> Windows程序具有相對固定的結構,對編寫者而言,不需要書寫整個過程,大部分過程由系統完成。程序中只要按一定的格式填寫系統留給客戶的那一小部分。</p><p> 所需要完成的有:窗口類的定義、窗口的建立、消息函數的書寫、消息循環(huán)。</p><
33、;p><b> 消息處理函數</b></p><p> Windows程序是事件驅動的,對于一個窗口,它的大部分例行維護是由系統維護的。每個窗口都有一個消息處理函數?! ≡谙⑻幚砗瘮抵?,對傳入的消息進行處理。系統內還有它自己的缺省消息處理函數。 客戶寫一個消息處理函數,在窗口建立前,將消息處理函數與窗口關聯。這樣,每當有消息產生時,就會去調用這個消息處理函數。</p&
34、gt;<p> 通常情況下,客戶都不會處理全部的消息,而是只處理自己感興趣的消息,其他的,則送回到系統的缺省消息處理函數中去。</p><p> LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)</p><p><b> {</b><
35、;/p><p> switch (message)</p><p><b> {</b></p><p><b> case ...</b></p><p><b> ...</b></p><p><b> case ...</b
36、></p><p><b> ...</b></p><p><b> }</b></p><p> return DefWindowProc (hwnd, message, wParam, lParam) ;</p><p><b> }</b></p&g
37、t;<p><b> 窗口的建立</b></p><p> 客戶需要自己建立窗口,建立后會得到系統返回的窗口句柄(HWND),后繼的針對窗口的操作都針對句柄進行。</p><p><b> 1.注冊窗口類</b></p><p> 建立窗口前,需要制定好這個窗口的相關屬性,最主要的就是將自己定義的消息
38、處理函數與窗口關聯,其他的屬性還包括:菜單、圖標等等。</p><p> 這個屬性指定步驟是通過指定"窗口類"來完成的。</p><p> 對于自己建立的窗口,這個"窗口類"需要自己制定,也即自己充一個WNDCLASS結構,然后向系統注冊。</p><p> 對于一些特殊窗口,如按鈕等控件,他們的行為是系統制定好了的,所
39、以不需要自己注冊,直接使用對應的“窗口類”名稱就行了。</p><p><b> 2.建立窗口</b></p><p> 建立窗口時,注冊的"窗口類"名稱作為參數傳入。</p><p> 這樣,當有針對該窗口的消息時,將調用“窗口類”中指定的消息處理函數,在其中得到處理。</p><p> 在
40、應用程序中使用對話框是很方便的,因為對話框可以從模板創(chuàng)建,而模板可以使用可視化資源編譯器進行編譯,這就大大簡化了窗口界面的設計過程。同時為了簡化程序設計,Windows在內部也定義了許多窗口類,即常說的字窗口控件,應用程序直接使用這些類名就可以創(chuàng)建子窗口。</p><p> 同子窗口控件類似,對話框的窗口函數也由User32.dll提供,所以在創(chuàng)建對話框之前不需要注冊窗口類。在創(chuàng)建對話框時并不需要調用Creat
41、eWindowEx函數,而是調用了DialogBoxParam或CreateDialogBox函數。前一個函數用來創(chuàng)建模式對話框,后一個函數用來創(chuàng)建非模式對話框,它們都在內部調用了CreateWindowEx函數,使用的風格、大小和位置等參數取自資源中定義的對話框模板。</p><p> 要創(chuàng)建對話框就要先創(chuàng)建對話框模板。對話框模板定義了對話框的基本屬性,這包括該對話框的寬度和高度及其中包含的控件。創(chuàng)建對話框模
42、板最簡單的方法是使用VC自帶的資源編譯器,使用VC++的“Insert/Resource”菜單命令,可以非常方便地向工程中加入對話框資源。</p><p><b> 消息循環(huán)</b></p><p> 系統會將針對這個程序的消息依次放到程序的“消息隊列”中,由程序自己依次取出消息,在分發(fā)到對應的窗口中去。</p><p> 因此,建立窗口
43、后,將進入一個循環(huán)。</p><p> 在循環(huán)中,取出消息、派發(fā)消息,循環(huán)往復,直到取得的消息是退出消息。</p><p> 循環(huán)退出后,程序即結束。</p><p> #include "stdafx.h"</p><p> #include <windows.h></p><p><
44、;b> //消息處理函數</b></p><p> //參數:窗口句柄,消息,消息參數,消息參數</p><p> LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)</p><p><b> {</b><
45、/p><p> //處理感興趣的消息</p><p> switch (message)</p><p><b> {</b></p><p> case WM_DESTROY:</p><p> //當用戶關閉窗口,窗口銷毀,程序需結束,發(fā)退出消息,以退出消息循環(huán)</p>&
46、lt;p> PostQuitMessage (0) ;</p><p> return 0 ;</p><p><b> }</b></p><p> //其他消息交給由系統提供的缺省處理函數</p><p> return ::DefWindowProc (hwnd, message, wParam,
47、lParam) ;</p><p><b> }</b></p><p><b> //應用程序主函數</b></p><p> //參數:實例句柄、前一個實例的句柄、命令行參數、窗口顯示方式int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstan
48、ce,PSTR szCmdLine, int iCmdShow)</p><p><b> {</b></p><p><b> //注冊窗口類</b></p><p> static TCHAR szAppName[] = TEXT ("HelloWin") ; //窗口類名稱</p&g
49、t;<p> //定制"窗口類"結構</p><p> WNDCLASS wndclass ;</p><p> wndclass.style = CS_HREDRAW | CS_VREDRAW ;</p><p> wndclass.lpfnWndProc = WndProc ; //關聯消息處理函數</p>
50、<p> wndclass.cbClsExtra = 0 ;</p><p> wndclass.cbWndExtra = 0 ;</p><p> wndclass.hInstance = hInstance ; //實例句柄</p><p> wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION)
51、; //圖標</p><p> wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //光標</p><p> wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); //畫刷</p><p> wndclass.lpszMenuName =
52、 NULL ;</p><p> wndclass.lpszClassName = szAppName; //類名稱</p><p><b> //注冊</b></p><p> if (!ReGISterClass (&wndclass))</p><p><b> {</b>&l
53、t;/p><p> MessageBox (NULL, TEXT ("RegisterClass Fail!"),</p><p> szAppName, MB_ICONERROR) ;</p><p> return 0 ;</p><p><b> }</b></p><p
54、><b> //建立窗口</b></p><p> HWND hwnd ;</p><p> hwnd = CreateWindow (szAppName, //窗口類名稱</p><p> TEXT ("The Hello Program"), //窗口標題</p><p> WS_
55、OVERLAPPEDWINDOW, //窗口風格</p><p> CW_USEDEFAULT,</p><p> CW_USEDEFAULT,</p><p> CW_USEDEFAULT,</p><p> CW_USEDEFAULT,</p><p><b> NULL,</b>&
56、lt;/p><p><b> NULL,</b></p><p> hInstance, //實例句柄</p><p><b> NULL);</b></p><p> ShowWindow (hwnd, iCmdShow) ;</p><p> UpdateWindo
57、w (hwnd) ;</p><p><b> //消息循環(huán)</b></p><p><b> MSG msg ;</b></p><p> while (GetMessage (&msg, NULL, 0, 0)) //從消息隊列中取消息</p><p><b> {&l
58、t;/b></p><p> TranslateMessage (&msg) ; //轉換消息</p><p> DispatchMessage (&msg) ; //派發(fā)消息</p><p><b> }</b></p><p> return msg.wParam ;</p>
59、<p><b> }</b></p><p> Windows網絡編程</p><p><b> 網絡和協議</b></p><p> 網絡是可以交換數據的互相連接的計算機的集合。網絡的類型很多,如LAN(局域網)、WAN(廣域網)、Internet。為了確保所有的傳輸平穩(wěn)地進行,網絡建立在協議之上。
60、協議是一組規(guī)定,他描述了數據傳送的格式。</p><p> 用戶發(fā)送的信息要經過各層協議的封裝,如圖4-1所示:</p><p><b> 應用層</b></p><p><b> TCP層</b></p><p><b> IP層</b></p><
61、;p><b> 鏈路層</b></p><p> 圖4-1 TCP/IP協議棧</p><p> TCP/IP是面向連接的協議。連接的兩個設備之間,每一方都使用他自己的IP地址和端口號。通常,一方稱為客戶,另外一方稱為服務器??蛻羰前l(fā)出請求方,服務器響應他們。例如,當打開網站時,瀏覽器是客戶,WebServer是服務器。瀏覽器發(fā)出連接請求,初始化和服務器的
62、連接,請求指定的資源。服務器然后返回響應和請求的數據。</p><p> 服務器通常是等待客戶連接,這叫做監(jiān)聽,這一般是在特定的IP地址和端口號進行??蛻魞H在有需要時才啟動,因為客戶總是一個連接的發(fā)起者,信息的請求者。為了創(chuàng)建連接,客戶需要知道服務起正在監(jiān)聽的IP地址和端口號。</p><p> 服務器和客戶方都需要使用IP地址和端口號,但是服務器的IP地址和端口號一般都是固定的。在客
63、戶方,端口號并不重要,任何端口都可以使用。</p><p> 工作在軟件層的幾個協議,如HTTP、FTP、POP3、SMTP等,大多數是以服務器/客戶機方式工作的。例如,客戶產生請求,服務器響應。請求和響應數據的準確格式由這些協議定義。</p><p> Winsock 接口</p><p> Winsock是處理網絡的Windows API。許多函數與BSD
64、 Unix中使用的Berkeley套接字函數是相同的。</p><p> 通信的雙方要建立連接,這個連接的終端就是套接字??蛻舳撕头掌鞫硕加幸粋€套接字,每個套接字與特定的IP地址和端口號關聯。</p><p> 幾乎所有的Winsock函數都在套接字上進行操作,因為套接字是連接的句柄。連接的兩端都要使用一貫套接字,它們與平臺無關。套接字是雙通的,也就是說在同一個套接字上既能夠接收也能
65、夠發(fā)送數據。</p><p> 套接字主要有兩種類型,一種是流套接字(SOCK_STREAM),另外一種是數據報套接字(SOCK_DGRAM)。流套接字是為需要可靠連接的應用程序設計的。這些程序經常使用連續(xù)的數據流。用于這種類型套接字的協議是TCP。流套接字最常用,一些眾所周知的協議如HTTP、TCP、SMTP、POP3等都使用它。</p><p> 數據報套接字使用UDP作為下層協議
66、,是無連接的,有一個最大緩沖區(qū)大小。它是為那些需要發(fā)送小數據包,并且對可靠性要求不高的應用程序設計的。與套接字不同,數據包套接字并不保證數據會到達終端,也不保證他是以正確的順序到來的。數據報套接字傳輸效率相當高,他經常用于音頻或視頻應用程序。對這些程序來說,速度比可靠性更加重要。</p><p> 另外,也存在一些不常用的套接字類型,如原始套接字(raw socket)等。</p><p&g
67、t; 因為Winsock要兼容幾個協議,所以必須使用通用的尋址方式。TCP/IP使用IP地址和端口號來指定一個地址,但是其他協議也許采用不同的形式。如果Winsock強迫使用特定的尋址方式,添加其他協議就不大可能。Winsock的第一個版本使用sockaddr結構來解決此問題。</p><p> Struct sockaddr</p><p> { u_short sa_f
68、amily;</p><p> Char sa_data[14];</p><p><b> };</b></p><p> 如果僅僅使用互聯網地址家族(TCP/IP),Winsock已經定義了sockaddr結構的TCP/IP版本——sockaddr_in結構。它們本質上是相同的結構,但是第2個更容易操作。</p>
69、;<p> Struct sockaddr_in{</p><p> Short sin_family; // 地址家族</p><p> U_short sin_port; // 端口號</p><p> Struct in_addr sin_addr; //IP地址</p><p&
70、gt; Char sin_zero[8]; //空字節(jié),要設為0</p><p><b> };</b></p><p> Sin_addr是IP地址(32位),他被定義為一個聯合來處理整個32位的值,兩個16位部分或者每個字節(jié)單獨分開。描述32位IP地址的in_addr結構定義如下。</p><p> Struct
71、in_addr{</p><p><b> Union{</b></p><p> Struct{u_char s_b1,s_b2,s_b3.s_b4;}S_un_b;</p><p> Struct{u_short s_w1.s_w2;}s_un_w; </p><p> U_long s_addr;</
72、p><p><b> }s_un;</b></p><p><b> };</b></p><p> 使用winsock編程的一般步驟是比較固定的,如下:</p><p> 1 winsock庫的裝入、初始化和釋放</p><p> 2套接字的創(chuàng)建和關閉</p&g
73、t;<p> 3綁定套接字到指定的IP地址和端口號</p><p> 4設置套接字進入監(jiān)聽狀態(tài)</p><p><b> 5接受連接請求</b></p><p><b> 6收發(fā)數據</b></p><p> 服務器程序和客戶程序創(chuàng)建過程</p><p&g
74、t; 在現在的軟件開發(fā)中,軟件開發(fā)環(huán)境越來越多地涉及了網絡環(huán)境以及網絡下的C/S(Client/Server)模式。</p><p> C/S模式,即客戶機/服務器模式興起于20世紀90年代初,到90年代中期達到鼎盛時期。C/S模式是第一個應用于網絡的模式,它在擁有友好的用戶界面的基礎上,利用分布技術成功地提高了執(zhí)行效率和系統容量,從而得到了廣泛的應用。</p><p> C/S模式
75、的基本思想是把原先集中在一起的應用劃分為功能不同的兩個部分,一個成為服務器軟件,用來響應和提供固定的服務;另一個被稱為客戶機軟件,用來向服務器端提請和要求某種服務。運行服務器軟件的計算機被簡稱為服務器,而運行客戶機軟件的計算機被成為客戶機,從這個意義上來說,客戶機和服務器都是軟件意義上的概念,同時也是相對的概念。例如,一臺計算機運行了某個網絡應用的服務器軟件,它就成為這個應用的服務器;如果同時它還在運行另外一個軟件的客戶機程序,則它同時
76、又是另外一個應用的客戶機。不過,因為服務器通常被設計為可以響應多臺客戶機的請求,所以一般都工作在性能較強、配置較高的計算機上。</p><p> 服務器方創(chuàng)建監(jiān)聽套接字,并為他關聯一個本地地址(指定IP地址和端口號)。然后進入監(jiān)聽狀態(tài)準備接收客戶的連接請求。為了接受客戶的連接請求,服務器必須調用accept函數。</p><p> 客戶方創(chuàng)建套接字后即可調用connect函數去試圖連接
77、服務器監(jiān)聽套接字。當服務起方接受函數返回后。連接函數也返回。此時客戶方使用socket函數創(chuàng)建套接字,服務器使用accept函數創(chuàng)建的套接字,雙方就可以進行相互間的通信了。</p><p><b> 其過程圖如下: </b></p><p> 圖4-2 服務器程序和客戶程序的創(chuàng)建過程</p><p> 語音傳輸系統功能實現</p&g
78、t;<p> 本系統以語音聊天為例給出了應用實例。</p><p><b> 語音模塊實現</b></p><p> 隨著計算機技術的發(fā)展,特別是海量存儲設備和大容量內存在PC機上的實現,對音頻媒體進行數字化處理便成為可能。數字化處理的核心是對音頻信息的采樣,通過對采集到的樣本進行加工,達成各種效果,這是對音頻媒體數字化處理的基本含義。</p
79、><p> 基本的音頻數字化處理包括以下幾種。</p><p> 1、不同采樣率、頻率、通道數之間的變換和轉換。其中變換只是將其視為另外一種格式,而轉換通過重新采樣來進行,其中還可以根據需要采用插值算法以補償失真。</p><p> 2、針對音頻數據本身進行的各種變換,如淡入、淡出、音量調節(jié)等。</p><p> 3、通過數字濾波算法進行
80、的變換,如高通、低通濾波器。</p><p> 但是最基本、最常用的還是聲音的錄制和播放。作為一個語音傳輸軟件,聲音的錄制、保存、傳輸和播放都是必不可少的,也是最重要的一環(huán)。本軟件需要語音輸入、輸出功能。這些技術的實現借助了Windows系統提供的底層音頻API。</p><p> MIDI的意思是樂器數字接口(Musical Instrument Digital Interface)
81、,它在微軟公司開發(fā)Windows系統以前就有的一個用于電子鍵盤的標準。MIDI定義了一個傳輸和存儲音樂信息的協議。它在多媒體音頻中占有重要的位置,是播放和錄制音樂的國際標準,它確定了連接音樂設備的電纜線、硬件和通信協議。</p><p> 下邊將介紹程序的具體實現。</p><p> 對于錄入和播放的聲音存儲時必須以特定的格式才可以,本軟件的格式定義如下:</p><
82、;p> m_soundFormat.wFormatTag=WAVE_FORMAT_PCM;</p><p> m_soundFormat.nChannels=1;</p><p> m_soundFormat.nSamplesPerSec=8000;</p><p> m_soundFormat.nAvgBytesPerSec=16000;</p
83、><p> m_soundFormat.nBlockAlign=2;</p><p> m_soundFormat.cbSize=0;</p><p> m_soundFormat.wBitsPerSample=16;</p><p> 只定義了聲音的格式是不夠的,要實現聲音的存儲還得對數據塊進行定義,數據塊的定義采用如下結構描述:<
84、;/p><p> m_pWaveHdrIn[0].lpData=m_cBufferIn;</p><p> m_pWaveHdrIn[0].dwBufferLength=MAX_BUFFER_SIZE;</p><p> m_pWaveHdrIn[0].dwBytesRecorded=0;</p><p> m_pWaveHdrIn[0]
85、.dwFlags=0;</p><p> 為了能夠進行錄制和播放,還需要利用低級音頻函數——wave系列函數。對于播放過程,需要利用waveOutPrepareHeader函數準備緩沖數據頭信息,然后調用函數waveOutWrite將音頻數據緩沖區(qū)中的數據寫到播放設備中去進行播放。對于錄制過程,需要先調用waveInPrepareHeader進行接收數據緩沖區(qū)的準備工作,然后調用waveInAddBuffer函
86、數添加錄制數據緩沖區(qū),最后調用函數waveInStart進行錄制。下邊將列出這些函數在源程序中的應用:</p><p> result=waveOutPrepareHeader(m_hWaveOut,&m_pWaveHdrOut[0],sizeof(WAVEHDR)); </p><p> if (result!= MMSYSERR_NOERROR) </p>
87、<p><b> {</b></p><p> AfxMessageBox(_T("Cannot OutPrepareHeader !"));</p><p><b> return;</b></p><p><b> };</b></p><
88、;p> If以后為信息出錯警告,以下函數省略。</p><p> result=waveOutWrite(m_hWaveOut,&m_pWaveHdrOut[0],sizeof(WAVEHDR)); </p><p> result=waveInPrepareHeader(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR));
89、</p><p> result=waveInAddBuffer(m_hWaveIn,&m_pWaveHdrIn[0],sizeof(WAVEHDR)); </p><p> void CSound::Record()</p><p><b> {</b></p><p> waveInStart(m_h
90、WaveIn);//開始錄音</p><p><b> }</b></p><p> 服務器和客戶端功能的實現</p><p> 服務器端與客戶端是程序與外界聯系的窗口。其主要功能實現如下:</p><p> if(temp.m_tag==1&&m_dlg->m_willchating==F
91、ALSE)</p><p> //如果有聲音過來并且本機的聲音設備已經準備好了則首先在本機發(fā)出聲音</p><p> if (m_aSessionOut != NULL)</p><p><b> {</b></p><p> msg->Serialize(*m_aSessionOut);</p>
92、;<p> m_aSessionOut->Flush();</p><p> return TRUE;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p>&
93、lt;p> //對方關閉了連接 </p><p> int CClientSocket::GetLocalHostName(CString &sHostName)//獲得本地計算機名稱</p><p> int CClientSocket::GetIpAddress(const CString &sHostName, CString &sIpAddre
94、ss)//獲得本地IP</p><p> 以上為部分功能實現。其他實現詳見源文件。 </p><p> 系統功能的測試與分析</p><p> 語音聊天程序使用介紹</p><p> 語音聊天程序的使用方法如下:</p><p> (1) 雙擊應用程序圖標,將會彈出一窗口。</p><p
95、> (2) 在窗口相應位置填寫服務器IP地址和端口號,默認IP地址為本機IP地址,默認端口號為4000。</p><p> (3) 如果是要建立服務器,點擊建立服務器按鈕,此時如果建立成功文本框會顯示“Server Has Been Set OK!”。如果失敗則會彈出警告窗口,請仔細檢查IP和端口號是否填寫正確。服務端運行界面見圖5-1。</p><p> (4) 如果要建立客
96、戶端,那么在填寫好服務器IP和端口號后點擊連接服務器按鈕。客戶端運行界面見5-2。</p><p> (5) 此時,大家可以進行文本聊天。如果想進行語音聊天那么請點擊語音聊天按鈕,當然你要有相應的硬件設備——音箱(耳機)和麥克風。那么現在你就可以進行語音聊天了。</p><p> (6) 如果想停止語音聊天的話,那么請點擊停止語音聊天按鈕,此按鈕和語音聊天按鈕是同一個。</p&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 考試系統畢業(yè)設計--基于vc開發(fā)與設計考試系統
- 考試系統畢業(yè)設計論文 基于vc開發(fā)與設計考試系統
- 畢業(yè)設計---基于vc++的視頻采集系統的開發(fā)
- 畢業(yè)設計論文基于vc管理系統開發(fā)
- 畢業(yè)設計---基于vc++的8數碼游戲設計與開發(fā)
- 畢業(yè)設計(論文)--基于vc++簡易心電圖分析系統的開發(fā)
- 基于vc的客房管理系統畢業(yè)設計
- 畢業(yè)設計開題報告—基于vc++的餐飲管理系統的設計與實現
- 基于vc的簡單即時通信軟件開發(fā)【畢業(yè)設計】
- 基于vc的五子棋游戲軟件的設計與開發(fā)畢業(yè)設計
- 畢業(yè)設計論文-基于vc++的工資管理系統的設計與實現
- qam傳輸系統的設計與實現畢業(yè)設計
- qam傳輸系統的設計與實現畢業(yè)設計
- 畢業(yè)設計---基于無線傳輸的數據采集系統設計
- 畢業(yè)設計---基于單片機的語音存儲與回放系統設計
- 畢業(yè)設計---基于無線傳輸的數據采集系統設計
- 電梯語音播報系統的設計畢業(yè)設計
- 基于vc++的點歌管理系統的設計和實現畢業(yè)設計(論文)
- 基于單片機的數據采集與傳輸系統設計畢業(yè)設計
- 基于android的esl管理系統的設計與開發(fā)【畢業(yè)設計】
評論
0/150
提交評論