全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1595
推到 Plurk!
推到 Facebook!

DirectPlay Lobby Server (DirectPlay連線伺服器的建制)

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-08-21 15:24:09 IP:61.218.xxx.xxx 未訂閱

DirectPlay Lobby Server

by: 劉小軍 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
系統時間:2024-03-29 2:06:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!