网页功能: 加入收藏 设为首页 网站搜索  
DiretPlay Lobby Server
发表日期:2006-08-23作者:[转贴] 出处:  

   DirectPlay中最有趣的莫过于Lobby Server了。什么是lobby呢?lobby有大厅的意思,想象一下参加博览会的情形吧,你在展厅(lobby)里随意浏览,你可能会发现许多你感兴趣的讲座或讨论(session),你也可以召集一些有相同兴趣的游客(player)展开一组新的讨论。一句话lobby是一个真正的虚拟现实环境。这样解释不知道是不是更形象一些,说实话,用外语读各种技术文章,再用母语来表述实在是一种痛苦的事情,总觉得词不达意,弄不好就是画蛇添足。这里主要一个原因可能是专业术语的解释没有一个统一规范,要是世界都统一一种语言就没那么麻烦了。所以我在文章里专业术语尽量不做翻译,自已英文水平差,还找这么多理由,够难为情的了。好吧,台阶也找了,下面就开始我们的lobby server。如果你对DiretPlay不是很熟悉的话,赶紧去看SDK文档吧。

  大家一定还记得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。

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 DiretPlay Lobby Server
本类热点文章
  udp服务器设计过程总结
  理解I/O Completion Port
  Internet 即时通信系统的设计与实现
  Epoll为我们带来什么
  Winsock开发网络通信程序的经典入门
  DirectPlay SDK中文翻译Understanding ..
  DirectPlay SDK中文翻译--Introduction..
  DirectPlay SDK中文翻译Understanding ..
  Winsock 函数简介
  DirectPlay SDK中文翻译Understanding ..
  Winsock程序设计初步之 Winsock编程原理
  非阻塞 Socoket 编程
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00541