版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、該命令用來導出線卡盤系統(tǒng)軟件。等。其中upload olt software ftp slot< slotlist> InitNonBlockingolt software 函數(shù)調用Socket API ioctlsocket star star slot 2 GCOB.gz注意事項: 對于需要統(tǒng)一線卡版本(編譯時間),通過卡系統(tǒng)文件這樣就不用到處找版本,但導出的線卡版本只實用于maple方案線卡,對于3458 方案線卡并不支持導出系統(tǒng)文件。該命令用來將主控盤補丁激活/去激活。Admin# patch activate/deactivate我司OLT設備每次只能生效一個補丁,也就是
2、最后導入并激活的補丁,但是每個新的補丁在CleanUp大版本之前都會涵蓋之前所有補丁的功能,對于主控盤補丁應該是主用主控盤和備用主控盤都要求同時打相應的補丁,對于激活備盤補丁應登錄到備盤中去激活。用開升級備用主控盤的系統(tǒng)文件。函數(shù)用于關閉該描述符;另外,用戶通過Admin# download ftp backup path < uaername> 注意事項:打補丁不需要重啟,補丁只需要激活就生效,備用補丁在備盤中激活。函數(shù)申請對該描述符中某些事件的監(jiān)聽,如前所述,該函數(shù)內(nèi)部調用了 WSAsyncSelect 來實現(xiàn)這一功能。 Socket Class 、 UDPSocket Cla
3、ss 和 TCPSocketClass 三個類都是 EventContext 的子類,它們封裝了 TCP 和 UDP 的部分實現(xiàn),同時擴展了 EventContext 中的事件,但都沒有改變其運行機制,因此此處不再詳述,留給讀者自行分析。我們要為大家分析的是另外一個比較復雜的 Socket 類 TCPListenerSocket 類。 TCPListenerSocket 用于監(jiān)聽 TCP 端口,當一個新連接請求到達后,該類將賦予這個新連接一個 Socket 對象和一個 Task 對象的配對。 首先分析TCPListenerSocket類的主要定義如下:class TCPListenerSock
4、et : public TCPSocket, public IdleTask/*提示:該類從有兩個基類,所以它既是一個事件監(jiān)聽者,同時也是一個任務Task。作為一個任務,給TCPListenerObject發(fā)送Kill事件就可以刪除它*/1 public:2 TCPListenerSocket( : TCPSocket(NULL, Socket:kNonBlockingSocketType, IdleTask(, fAddr(0, fPort(0, fOutOfDescriptors(false /構造函數(shù)3 virtual TCPListenerSocket( /析構函數(shù)/addr為地址,p
5、ort為端口號,初始化函數(shù)自動監(jiān)聽TCP端口4 OS_Error Initialize(UInt32 addr, UInt16 port;/子類必須重載該純虛函數(shù),用于建立新連接時生成任務對象5 virtual Task* GetSessionTask(TCPSocket* outSocket = 0;6 virtual SInt64 Run(; /重載Task的Run函數(shù),子類仍可重載7 private:/重載EventContext的ProcessEvent函數(shù),用于產(chǎn)生Socket和Task對象配對8 virtual void ProcessEvent(int eventBits;9 O
6、S_Error Listen(UInt32 queueLength;/其他略前面我們分析得知,EventContext類通過ProcessEvent函數(shù)來實現(xiàn)對任務的傳信工作,但在TCPListenerSocket 中,ProcessEvent函數(shù)被重載用來創(chuàng)建Socket和Task對象得配對,該函數(shù)的實現(xiàn)如下:void TCPListenerSocket:ProcessEvent(int /*eventBits*/ /*提示:該函數(shù)運行于系統(tǒng)唯一的EventThread線程中,所以要盡量快速,以免占用過多的系統(tǒng)資源*/此處略去部分定義1 Task* theTask = NULL; /Task
7、對象2 TCPSocket* theSocket = NULL; /Socket對象/創(chuàng)建對象配對3 while (true4 /accept連接5 int osSocket = accept(fFileDesc, (struct sockaddr*&addr, &size; 6 if (osSocket = -1 /監(jiān)聽端口出錯7 /此處略去出錯處理 /用子類重載的GetSessionTask函數(shù)創(chuàng)建Task對象8 if (theTask = this->GetSessionTask(&theSocket=NULL /創(chuàng)建出錯9 close(osSoc
8、ket;10 else /創(chuàng)建成功,接著創(chuàng)建Socket對象11 12 Assert(osSocket != EventContext:kInvalidFileDesc;/此處略去部分對新建連接端口的設置(setsockopt函數(shù)/創(chuàng)建新的Socket對象13 theSocket->Set(osSocket, &addr;14 theSocket->InitNonBlocking(osSocket; /初始化15 theSocket->SetTask(theTask; /設置對應的任務16 theSocket->RequestEvent(EV_RE;
9、 /新對象監(jiān)聽讀事件17 18 /處理完一次連接請求后,TCPListenerSocket對象還要接著監(jiān)聽19 this->RequestEvent(EV_RE;對Socket類的分析基本完成了,從中我們可以發(fā)現(xiàn),DSS對于網(wǎng)絡傳信和任務調度之間的處理非常精密,環(huán)環(huán)相扣,在某種程度上甚至是有些過a于花哨。但是這些基本類是上層RTSP/RTP等服務器子系統(tǒng)編碼的基礎,因此希望讀者能夠從本質上掌握這些代碼。4 核心功能庫(Server Core)4.1 RTSP 子系統(tǒng)RTSP標準是實時流控制協(xié)議(Real-Time Streaming Protocol RFC2326)的簡稱,它被客戶和流
10、式媒體服務器用來交換對媒體的控制信息。圖6是RTSP基本*作的描述。再給出一個RTSP協(xié)議的例子如下:DSS開發(fā)了一個RTSP子系統(tǒng)來支持標準的RTSP協(xié)議,本節(jié)將分析這些源代碼。首先,DSS定義了一個TCPListenerSocket類的子類RTSPListenerSocket,用于監(jiān)聽RTSP連接請求。RTSPListenerSocket類做的唯一一件事就是重載了GetSessionTask函數(shù),當客戶的連接請求到達后,它創(chuàng)建了一個Socket對象和RTSPSession對象的配對(在TCPListenerSocket:ProcessEvent)。RTSPSession對象是Task類的子
11、類,是專門用于處理RTSP請求的任務類。如圖7所示,RTSP連接建立后,服務器會為每個客戶維護一個Socket對象和RTSPSession對象的配對;當客戶的RTSP請求到達時,Socket對象就會調用RTSPSession對象的Signal(Task基類中方法傳信,即將RTSPSession對象加入到TaskThread對象的任務隊列中去;而當時間片到來,TaskThread線程就會調用RTSPSession對象的Run方法,這個方法就會處理客戶發(fā)送過來的RTSP請求。因此,下面我們將主要分析RTSPSession的Run方法。為了跟蹤當前處理的情況,RTSPSession類內(nèi)部定義了多個狀
12、態(tài),而Run方法其實就是通過在這些狀態(tài)之間不斷切換,同時對客戶的RTSP請求做出不同的處理。enum/RTSPSession的基本狀態(tài)kReadingRequest= 0,kFilteringRequest= 1,kRoutingRequest= 2,kAuthenticatingRequest= 3,kPreprocessingRequest= 4,kProcessingRequest= 5,kSendingResponse= 6,kPostProcessingRequest = 7,kCleaningUp= 8,/當RTSP協(xié)議通過HTTP隧道實現(xiàn)時將用到下面的狀態(tài)kWaitingToBi
13、ndHTTPTunnel = 9, kSocketHasBeenBoundIntoHTTPTunnel = 10,kHTTPFilteringRequest = 11, kReadingFirstRequest = 12, kHaveNonTunnelMessage = 13 另外,值得注意的是,DSS提供一種稱為Module的二次開發(fā)模式,開發(fā)人員可以編寫新的Module并且注冊其希望運行的狀態(tài),系統(tǒng)就會在相應的狀態(tài)下調用該Module,從而將控制權暫時交給二次開發(fā)的代碼,以便增強系統(tǒng)的功能。簡單起見,下面我們將分析不存在客戶模塊的Run(函數(shù)源代碼。
14、首先分析其主框架如下:SInt64 RTSPSession:Run(1 EventFlags events = this->GetEvents(; /取出事件2 QTSS_Error err = QTSS_NoErr;3 QTSSModule* theModule = NULL;4 UInt32 numModules = 0;/ 設定當前的Module狀態(tài)5 OSThread:GetCurrent(->SetThreadData(&fModuleState;/檢查該連接是否超時,如果是就設定狀態(tài)斷掉該連接6 if (events & Task:kTimeoutEve
15、nt | (events & Task:kKillEvent7 fLiveSession = false;8 while (this->IsLiveSession( /如果連接尚未拆除,執(zhí)行狀態(tài)機9 /* 提示:下面是RTSPSession的狀態(tài)機。因為在處理RTSP請求過程中,有多個地方需要Run方法返回以便繼續(xù)監(jiān)聽新的事件。為此,我們需要跟蹤當前的運行狀態(tài),以便在被打斷后還能回到原狀態(tài)*/10 tch (fState11 12 case 狀態(tài)1: /處理略13 case 狀態(tài)2: /處理略14 case 狀態(tài)n: /處理略15 /此處略Run函數(shù)的主框架比較簡單,其核心就在于
16、1015的狀態(tài)機,因此我們希望按照客戶請求到達并且被處理的主要流程為讀者描述該狀態(tài)機的運轉。1第一次請求到達進入kReadingFirstRequest狀態(tài),該狀態(tài)主要負責從RTSPRequestStream類的對象fInputStream中讀出客戶的RTSP請求,其處理如下:case kReadingFirstRequest:1 if (err = fInputStream.ReadRequest(=QTSS_NoErr2 /* RequestStream返回QTSS_NoErr意味著所有數(shù)據(jù)已經(jīng)從Socket中讀出,但尚不能構成一個完整的請求,因此必須等待更多的數(shù)據(jù)到達*/3 fInput
17、SocketP->RequestEvent(EV_RE; /接著請求監(jiān)聽讀事件4 return 0; /Run函數(shù)返回,等待下一個事件發(fā)生5 6 if (err != QTSS_RequestArrived && (err != E2BIG7 /出錯,停止處理8 Assert(err > 0; 9 Assert(!this->IsLiveSession(;10 break;11 /請求已經(jīng)完全到達,轉入kHTTPFilteringRequest狀態(tài)12 if (err = QTSS_RequestArrived13 fState = kHTTPFil
18、teringRequest;/接收緩沖區(qū)溢出,轉入kHaveNonTunnelMessage狀態(tài)14 if (err=E2BIG15 fState = kHaveNonTunnelMessage;continue;2正常情況下,在獲得一個完整的RTSP請求后(上第12行),系統(tǒng)將進入kHTTPFilteringRequest狀態(tài)該狀態(tài)檢查RTSP連接是否需要經(jīng)過HTTP代理實現(xiàn);如不需要,轉入kHaveNonTunnelMessage狀態(tài)。3進入kHaveNonTunnelMessage狀態(tài)后,系統(tǒng)創(chuàng)建了RTSPRequest類的對象fRequest,該對象解析客戶的RTSP請求,并保存各種屬
19、性。fRequest對象被傳遞給其他狀態(tài)處理。4接著進入kFilteringRequest狀態(tài),二次開發(fā)人員可以通過編寫Module對客戶的請求做出特殊處理。如果客戶的請求為正常的RTSP請求,系統(tǒng)調用SetupRequest函數(shù)建立用于管理數(shù)據(jù)傳輸?shù)腞TPSession類對象,其源代碼分析如下:5 DSS二次開發(fā)接口:Module開發(fā)流程 作為一個運行于多個*作系統(tǒng)平臺的開發(fā)源代碼的服務器,DSS提供了一種稱為Module的二次開發(fā)接口。使用這個開發(fā)接口,我們可以充分利用服務器的可擴展性及其實現(xiàn)的多種協(xié)議,并且能夠保證和將來版本兼容。DSS中的許多核心功能也是以Module的方式預先實現(xiàn)并且
20、編譯的,因此可以說對Module的支持已經(jīng)被設計到DSS的內(nèi)核中去了。 下面我們將分析DSS的一個內(nèi)嵌Module:QTSSFileModule的源代碼來說明Module的編程方式,QTSSFileModule的實現(xiàn)在QTSSFileModule.cpp文件中。 每個QTSS Module必須實現(xiàn)兩個函數(shù): 首先,每個QTSS Module必須實現(xiàn)一個主函數(shù),服務器調用該函數(shù)用于啟動和初始化模塊中的QTSS函數(shù);QTSSFileModule主函數(shù)的實現(xiàn)如下: QTSS_Error QTSSFileModule_Main(void* inPrivateArgs return _stublibra
21、ry_main(inPrivateArgs, QTSSFileModuleDispatch; 其中QTSSFileModuleDispatch是Module必須實現(xiàn)的分發(fā)函數(shù)名。 另一個需要實現(xiàn)的是分發(fā)函數(shù),服務器調用該函數(shù)實現(xiàn)某個特殊任務。此時,服務器將向分發(fā)函數(shù)傳入任務的名字和一個任務相關的參數(shù)塊。QTSSFileModule分發(fā)函數(shù)的實現(xiàn)如下: QTSS_Error QTSSFileModuleDispatch(QTSS_Role inRole, QTSS_RoleParamPtr inParamBlock /根據(jù)傳入的任務名稱和入?yún)?zhí)行相應的處理函數(shù) switch (inRole/任務
22、名稱 case QTSS_Register_Role: return Register(&inParamBlock->regParams;case QTSS_Initialize_Role: return Initialize(&inParamBlock->initParams; case QTSS_RereadPrefs_Role: return RereadPrefs(; case QTSS_RTSPRequest_Role: return ProcessRTSPRequest(&inParamBlock->rtspRequestParams; c
23、ase QTSS_RTPSendPackets_Role: return SendPackets(&inParamBlock->rtpSendPacketsParams; case QTSS_ClientSessionClosing_Role: return DestroySession(&inParamBlock->clientSessionClosingParams; return QTSS_NoErr; 其中,分發(fā)函數(shù)的入?yún)⑹且粋€聯(lián)合,它根據(jù)任務名稱的不同,具體的數(shù)據(jù)結構也不同,下面是該數(shù)據(jù)結構的定義: typedef union QTSS_Register_
24、Params regParams; QTSS_Initialize_Params initParams; QTSS_ErrorLog_Params errorParams; /此處略去其他多個數(shù)據(jù)結構 QTSS_RoleParams, *QTSS_RoleParamPtr;DSS提供了兩種方式把我們自己開發(fā)的Module添加到服務器中:一種稱為靜態(tài)模塊(Static Module),該方式將我們開發(fā)的Module代碼直接編譯到內(nèi)核中去;另一種稱為動態(tài)模塊(Dynamic Module),該方式將我們開發(fā)的Module單獨編譯稱為一個動態(tài)庫,然后修改配置,使服務器在啟動時將其加載。圖9描述了DS
25、S啟動和關閉時模塊調用流程。當服務器啟動時,它首先裝載沒有被編譯進內(nèi)核的動態(tài)模塊,然后才裝載被編譯進內(nèi)核的靜態(tài)模塊;由于現(xiàn)有的大部分系統(tǒng)功能都是以靜態(tài)模塊的方式存在的,如果你希望用自己的模塊替換某個系統(tǒng)功能,最好是編寫一個動態(tài)模塊,因為它們將早于靜態(tài)模塊被裝載。 無論是靜態(tài)模塊還是動態(tài)模塊,它們的代碼都是相同的,唯一的不同就是它們的編譯方式。首先為了將靜態(tài)模塊編譯到服務器中,我們必須修改QTSServer.cpp文件中的QTSServer:LoadCompiledInModules,并向其中加入以下代碼: QTSSModule* myModule=new QTSSModule(*_XYZ_*;(voidmyModule->Initialize(&sCallbacks,&_XYZMAIN_;(voidAddModule(MyModule; 其中,XYZ是靜態(tài)模塊的名字,而XYZMAIN則是其主函數(shù)入口。 動態(tài)模塊的編譯方法如下:首先單獨編譯動態(tài)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆黑龍江省雞西市第一中學數(shù)學高三上期末質量跟蹤監(jiān)視模擬試題含解析
- 新疆維吾爾自治區(qū)吐魯番市高昌區(qū)二中2025屆高三語文第一學期期末復習檢測模擬試題含解析
- 2025屆山東省棗莊市第四十一中學生物高三第一學期期末考試試題含解析
- 四川省宜賓第三中學2025屆高二上數(shù)學期末質量跟蹤監(jiān)視試題含解析
- 甘肅省天水市第三中學2025屆數(shù)學高二上期末達標檢測試題含解析
- 廣東省東莞市第五高級中學2025屆高二生物第一學期期末學業(yè)質量監(jiān)測試題含解析
- 天津市和平區(qū)2025屆高一上數(shù)學期末達標檢測模擬試題含解析
- 2025屆湖北省襄陽市重點中學生物高一上期末教學質量檢測模擬試題含解析
- 重慶三十二中學2025屆生物高一上期末復習檢測模擬試題含解析
- 安徽省皖江聯(lián)盟2025屆數(shù)學高二上期末學業(yè)質量監(jiān)測模擬試題含解析
- 奢侈品管理概論第7章中國奢侈品市場概論
- 籃球賽參賽安全應急預案
- 廚房設備操作與維護
- 七年級(上)道法-重點知識點歸納
- 滬科版八年級數(shù)學(上)期中考試基礎知識總結
- 國網(wǎng)四措一案
- 碳青霉烯腸桿菌預防與控制標準(WST826-2023)考核試題及答案
- 《伐檀》名師課堂
- 2023-2024學年人教版數(shù)學一年級上冊 第8單元 20以內(nèi)的進位加法
- 學校保安服務質量評價表
- 小學科學實驗室儀器設備增補說明
評論
0/150
提交評論