DirectPlay Lobby Server (DirectPlay連線伺服器的建制) |
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
DirectPlay Lobby Serverby: 劉小軍 LobbyServer演示源碼 (33K) 資料來源:http://www.cpp3d.com/articles/index.asp?page=4 DirectPlay中最有趣的莫過于Lobby Server了。什麼是lobby呢?Lobby有大廳的意思,想象一下參加博覽會的情形吧,你在展廳(lobby)里隨意瀏覽,你可能會發現許多你感興趣的講座或討論(session),你也可以召集一些有相同興趣的游客(player)展開一組新的討論。一句話lobby是一個真正的虛擬現實環境。這樣解釋不知道是不是更形象一些,說實話,用外語讀各種技術文章,再用母語來表述實在是一種痛苦的事情,總覺得詞不達意,弄不好就是畫蛇添足。這里主要一個原因可能是專業術語的解釋沒有一個統一規範,要是世界都統一一種語言就沒那麼麻煩了。所以我在文章里專業術語盡量不做翻譯,自已英文水平差,還找這麼多理由,夠難為情的了。好吧,台階也找了,下面就開始我們的lobby server。如果你對DiretPlay不是很熟悉的話,趕緊去看SDK文檔吧。本文的例程源碼可點這里下載,編譯需VC,DX SDK6.0。 大家一定還記得SDK中帶有一個lobby server,它初始時創建了一個session,並在此session下創建了四個group,用SDK帶的另外一個例程bellhop就可在lobby中漫游了。同時SDK中還有一個lobby provider(lobbysrv.dll),客戶程序bellhop就是通過它實現與lobby server的通訊。遺憾的是我找遍所有SDK文檔,包括很多網上資源,沒有半字介紹如何實現lobby provider(有誰知道?請通知我)。所以不要問我任何關于實現lobby provider的問題。 我們這里的lobby server要具備的功能有:可選擇通訊方式(service provider),可隨意創建多個session,可隨意主持(host)任一session。方便起見,客戶程序採用SDK帶的dpchart例程。 下面我們一步一步來看看程序是如何實現的: 首先,是要取得一個DirectPlayLobby interface,然后枚舉出所有service provider供選擇,程序重寫了service provider對話框,如何重寫service provider對話框請參考SDK文檔。// get ANSI DirectPlayLobby interface hr = CoCreateInstance( CLSID_DirectPlayLobby, NULL, CLSCTX_INPROC_SERVER, IID_IDirectPlayLobby3A, (LPVOID*)&lpDPlayLobby3A); if SUCCEEDED(hr) { // put all the service providers in combo box SendDlgItemMessage(IDC_COMBO_ServiceProvider, CB_ADDSTRING, 0, (LPARAM)"<< Select a service provider first >>"); EnumerateSP(); } ………… // when a service provider has selected // get service provider address from information in dialog HRESULT hr = CreateServiceProviderAddress();接下來就是創建session了,輸入了session名后以該名開始一個session,並創建一個player作為該session的主持,同時用一個線程來處理來自客戶程序的各種消息。 // get a DirectPlay interface hr = InitializeDirectPlay(); ………… // open a session hr = m_lpDPlay->Open( &sessionDesc, DPOPEN_CREATE ); ………… // create the message in processor m_pMsgProIn = new CMessageProcessorIn( this ); ………… // create the server player hr = m_lpDPlay->CreatePlayer( &m_serverPlayerID, &name, m_pMsgProIn->m_eventMsgReceived, NULL, 0, DPPLAYER_SERVERPLAYER );程序的關鍵就是CMessageProcessorIn的消息響應,作為例子,程序的消息處理非常簡單,可能還不能成為一個lobby server,這里只想起一個拋磚引玉的作用,有興趣的話你自己可以根據實際情況定制你自己的lobby server。 程序用法:首先在一台機子上運行LobbyServer,然后就可在本機或其它機子上運行SDK帶的DPChat作為客戶程序,如果你用LobbyServer開始了多個session,則你應該在DPChat中枚舉到這些session。如果你是在單機上運行,請輸入本機IP址127.0.0.1。 現在可以試試多開幾個session,過過boss癮吧!感覺如何? 如何用SDK帶的Bellhop作客戶程序? 只要將LobbyServerDlg.cpp中的GUID定義成與Bellhop中的一樣,然后將Bellhop例程dialog.cpp中的 IDirectPlayX_EnumConnections(lpDirectPlay4A, &BELLHOP_GUID, DirectPlayEnumConnectionsCallback, &enStruct, DPCONNECTION_DIRECTPLAYLOBBY); 改為: IDirectPlayX_EnumConnections(lpDirectPlay4A, &BELLHOP_GUID, DirectPlayEnumConnectionsCallback, &enStruct, 0);就行了。不過用Bellhop作客戶可能會出現一些錯誤,可修改消息處理部份程序解決。 本文的例程源碼可點這里下載,編譯需VC6.0,DX SDK6.0。 網路志工聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]--- 發表人 - axsoft 於 2002/08/22 08:54:06 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |