📄 network1.cpp
字号:
return(DP_ERROR_INPUT_SESSION_CHOICE);
}
OutputDebugString( "Step 9: CreatePlayer\n" );
if ((hr = DP_lpIDC->CreatePlayer(//DP_lpIDC,
&DP_dcoID, DP_NickName,
"CB_Player", &DP_dphEvent)) != DP_OK)
{
DP_lpIDC->Close();
DP_lpIDC->Release();
DP_lpIDC = NULL;
return(FALSE);
}
return(TRUE);
}*/
//此模块是建立Session
int DP_CreateSession( void )
{
DPSESSIONDESC dpDesc;
HRESULT hr;
if( DP_FullName==NULL )
{
#ifdef DEBUG
MessageBox(DP_hWndMain,"The Session Name is empty!"," Error",MB_OK);
#endif
return ( DP_SESSION_NAME_EMPTY );
}
if( DP_NickName==NULL )
{
#ifdef DEBUG
MessageBox(DP_hWndMain,"The Friendly Name is empty!"," Error",MB_OK);
#endif
return ( DP_FRIENDLY_NAME_EMPTY );
}
memset(&dpDesc, 0x00, sizeof(DPSESSIONDESC));
dpDesc.dwSize = sizeof(dpDesc);
dpDesc.dwMaxPlayers = MAX_PLAYERS;
dpDesc.dwFlags = DPOPEN_CREATESESSION;
dpDesc.guidSession = DP_pGuid;
strcpy( dpDesc.szSessionName, DP_FullName);
// OutputDebugString( "Step 4: Create, Open\n" );
//用于创建一个Session,只需用Open函数
//将用于描述Session的结构的dwFlags设为DPOPEN_CREATESESSION
hr = DP_lpIDC->Open(//DP_lpIDC,
&dpDesc);
if (hr!= DP_OK)
{
DP_lpIDC->Release();
DP_lpIDC = NULL;
#ifdef DEBUG
MessageBox(DP_hWndMain,"Create Game Error!"," Error",MB_OK);
#endif
switch ( hr )
{
case DPERR_INVALIDPARAMS:
return( DP_ERROR_INVALID_PARAMS );
break;
case DPERR_GENERIC:
return( DP_ERROR_GENERIC );
break;
case DPERR_UNAVAILABLE:
return( DP_ERROR_UNAVAILABLE );
break;
case DPERR_UNSUPPORTED:
return( DP_ERROR_UNSUPPORTED );
break;
case DPERR_USERCANCEL:
return( DP_ERROR_USER_CANCEL );
break;
case DPERR_ACTIVEPLAYERS:
return( DP_ERROR_ACTIVE_PLAYERS );
break;
case DPERR_INVALIDOBJECT:
return( DP_ERROR_INVALID_OBJECT );
break;
}
return( DP_ERROR_CREATE_SESSION );
}
//创建一个Player,其中的DP_NickName是玩家给自己起的名字
if ((hr = DP_lpIDC->CreatePlayer(//DP_lpIDC,
&DP_dcoID, DP_NickName,
"CB_Player", &DP_dphEvent)) != DP_OK)
{
DP_lpIDC->Close();
DP_lpIDC->Release();
DP_lpIDC = NULL;
switch( hr )
{
case DPERR_CANTCREATEPLAYER:
return( DP_ERROR_NOT_CREATE_PLAYER );
break;
case DPERR_NOCONNECTION:
return( DP_ERROR_NOT_CONNECT );
break;
case DPERR_CANTADDPLAYER:
return( DP_NOT_ADD_PLAYERS );
break;
case DPERR_INVALIDPARAMS:
return( DP_ERROR_INVALID_PARAMS );
break;
case DPERR_GENERIC:
return( DP_ERROR_GENERIC );
break;
case DPERR_INVALIDOBJECT:
return( DP_ERROR_INVALID_OBJECT );
break;
}
return( DP_ERROR_CREATE_PLAYER );
}
DP_IsHost = DP_HOST;
DP_PlayerInformation[DP_NumPlayer].DP_dcoID=DP_dcoID;
memcpy(DP_PlayerInformation[DP_NumPlayer].DP_NickName,DP_NickName,strlen((char *)(DP_NickName))+1);
DP_NumPlayer++;
/* if(DP_SendAddPlayers()!=OK)
{
DP_lpIDC->Close();
DP_lpIDC->Release();
DP_lpIDC = NULL;
return( DP_ERROR_SEND_MESSAGE );
}*/
return ( OK );
}
//此模块是用来得到已经在网络中的Session信息
int DP_GetSession( void )
{
// HRESULT hr;
// DP_IsHost = FALSE;
DP_g_lpGuid = (LPGUID) &DP_pGuid;
if (DP_GetGame(DP_hWndMain)==DP_ERROR_ENUM_SESSION)
{
#ifdef DEBUG
MessageBox(DP_hWndMain,"Enumerate Session Error!"," Error",MB_OK);
#endif
return (DP_ERROR_ENUM_SESSION);
}
return ( OK );
}
//根据玩家的选择,确定联接到哪个Session上
int DP_ConnectSession( void )
{
HRESULT hr;
if(DP_SessionNO<0)
{
#ifdef DEBUG
MessageBox(DP_hWndMain,"Input Session Choice Error!"," Error",MB_OK);
#endif
return (DP_ERROR_INPUT_SESSION_CHOICE);
}
//通过玩家的选择,打开一个Session
if(DP_DlgProcSelSession(DP_SessionNO)!=OK)
{
#ifdef DEBUG
MessageBox(DP_hWndMain,"Open Session Error!"," Error",MB_OK);
#endif
return(DP_ERROR_OPEN_SESSION);
}
if (DP_lpIDC == NULL)
{
#ifdef DEBUG
MessageBox(DP_hWndMain,"Player ID is empty!"," Error",MB_OK);
#endif
return(DP_PLAYER_ID_EMPTY);
}
//创建一个Player,其中的DP_NickName是玩家给自己起的名字
if ((hr = DP_lpIDC->CreatePlayer(//DP_lpIDC,
&DP_dcoID, DP_NickName,
"CB_Player", &DP_dphEvent)) != DP_OK)
{
DP_lpIDC->Close();
DP_lpIDC->Release();
DP_lpIDC = NULL;
switch( hr )
{
case DPERR_CANTCREATEPLAYER:
return( DP_ERROR_NOT_CREATE_PLAYER );
break;
case DPERR_NOCONNECTION:
return( DP_ERROR_NOT_CONNECT );
break;
case DPERR_CANTADDPLAYER:
return( DP_NOT_ADD_PLAYERS );
break;
case DPERR_INVALIDPARAMS:
return( DP_ERROR_INVALID_PARAMS );
break;
case DPERR_GENERIC:
return( DP_ERROR_GENERIC );
break;
case DPERR_INVALIDOBJECT:
return( DP_ERROR_INVALID_OBJECT );
break;
}
return( DP_ERROR_CREATE_PLAYER );
}
DP_IsHost = DP_JOIN;
// DP_PlayerInformation[DP_NumPlayer].DP_dcoID=DP_dcoID;
// memcpy(DP_PlayerInformation[DP_NumPlayer].DP_NickName,DP_NickName,strlen((char *)(DP_NickName))+1);
// DP_NumPlayer++;
if(DP_SendAddPlayers( DP_SEND_TO_SERVER )!=OK)
{
DP_lpIDC->Close();
DP_lpIDC->Release();
DP_lpIDC = NULL;
return( DP_ERROR_SEND_MESSAGE );
}
return ( OK );
}
//此模块用来得到系统提供的服务类型
int DP_GetProvider(HWND hWndCtl)
{
HRESULT hr;
hr=DirectPlayEnumerate(DP_EnumSP,(LPVOID)hWndCtl);
if(hr!=DP_OK)
{
#ifdef DEBUG
MessageBox(DP_hWndMain,"I can not get provider!"," Error",MB_OK);
#endif
switch( hr )
{
case DPERR_EXCEPTION:
return( DP_ERROR_EXCEPTION );
break;
case DPERR_GENERIC:
return( DP_ERROR_GENERIC );
break;
}
return (DP_ERROR_GET_PROVIDER);
}
return ( OK );
}
//从网络中得到所有的Session信息
int DP_GetGame(HWND hWndCtl)
{
DPSESSIONDESC dpDesc;
HRESULT hr;
memset(&dpDesc, 0x00, sizeof(DPSESSIONDESC));
dpDesc.dwSize = sizeof(dpDesc);
dpDesc.guidSession = *DP_g_lpGuid;
// enum sessions with 5 second timeout
#ifdef DDEBUG
OutputDebugString( "Step 7: EnumSessions\n" );
#endif
hr=DP_lpIDC->/*lpVtbl->*/EnumSessions(//DP_lpIDC,
&dpDesc, (DWORD)1000,
DP_EnumSession, (LPVOID) hWndCtl,
(DWORD)NULL);
if (hr!=DP_OK)
{
switch( hr )
{
case DPERR_INVALIDPARAMS:
return( DP_ERROR_INVALID_PARAMS );
break;
case DPERR_INVALIDOBJECT:
return( DP_ERROR_INVALID_OBJECT );
break;
}
return (DP_ERROR_ENUM_SESSION);
}
return( OK );
}
//创建玩家选择的服务类型
BOOL DP_DlgProcChooseProvider(int i)
{
HRESULT hr;
if (DP_lpIDC!=NULL)
{
DP_lpIDC->Release();
DP_lpIDC=NULL;
// return FALSE;
}
// DP_lpIDC=NULL;
hr=DirectPlayCreate((LPGUID)&DP_EnumCb[i].PointGUID, &DP_lpIDC, NULL);
switch(hr)
{
case DPERR_GENERIC:
return( DP_ERROR_GENERIC );
break;
case DPERR_EXCEPTION:
return( DP_ERROR_EXCEPTION );
break;
case DPERR_UNAVAILABLE:
return( DP_ERROR_UNAVAILABLE );
break;
}
return TRUE;
}
//此函数用做EnumSession的回调函数
BOOL FAR PASCAL DP_EnumSession(LPDPSESSIONDESC lpDPGameDesc, LPVOID lpContext,
LPDWORD lpdwTimeOut, DWORD dwFlags)
{
static int i=0;
if(DP_EnumSessionCb[0].PointDPGameDesc.dwSession==0)
{i=0;}
if( dwFlags & DPESC_TIMEDOUT )
{
return FALSE; // don't try again
}
if(strcpy(DP_EnumSessionCb[i].PointDPGameDesc.szSessionName,
lpDPGameDesc->szSessionName)==0)
{return FALSE;}
DP_EnumSessionCb[i].PointDPGameDesc.dwSession=lpDPGameDesc->dwSession;
i++;
return (TRUE);
}
//此函数用做DirectPlayEnumerate的回调函数
BOOL FAR PASCAL DP_EnumSP(LPGUID lpGuid, LPSTR lpDesc, DWORD dwMajorVersion,
DWORD dwMinorVersion, LPVOID lpv)
{
// static int i=0;
//if(memcpy(&DP_EnumCb[i].PointGUID,lpGuid,sizeof(LPGUID))==0)
// {return FALSE;}
DP_EnumCb[DP_ProviderNum].PointGUID.Data1=lpGuid->Data1;
DP_EnumCb[DP_ProviderNum].PointGUID.Data2=lpGuid->Data2;
DP_EnumCb[DP_ProviderNum].PointGUID.Data3=lpGuid->Data3;
DP_EnumCb[DP_ProviderNum].PointGUID.Data4[0]=(BYTE)lpGuid->Data4[0];
DP_EnumCb[DP_ProviderNum].PointGUID.Data4[1]=(BYTE)lpGuid->Data4[1];
DP_EnumCb[DP_ProviderNum].PointGUID.Data4[2]=(BYTE)lpGuid->Data4[2];
DP_EnumCb[DP_ProviderNum].PointGUID.Data4[3]=(BYTE)lpGuid->Data4[3];
DP_EnumCb[DP_ProviderNum].PointGUID.Data4[4]=(BYTE)lpGuid->Data4[4];
DP_EnumCb[DP_ProviderNum].PointGUID.Data4[5]=(BYTE)lpGuid->Data4[5];
DP_EnumCb[DP_ProviderNum].PointGUID.Data4[6]=(BYTE)lpGuid->Data4[6];
DP_EnumCb[DP_ProviderNum].PointGUID.Data4[7]=(BYTE)lpGuid->Data4[7];
if(memcpy(&DP_EnumCb[DP_ProviderNum].PointDesc,lpDesc,strlen(lpDesc)+1)==0)
{return FALSE;}
DP_ProviderNum++;
return TRUE;
}
//此函数是用来打开玩家指定的Session
int DP_DlgProcSelSession (int i)
{
DPSESSIONDESC dpDesc;
HRESULT hr = DP_OK + 10;
memset(&dpDesc, 0x00, sizeof(DPSESSIONDESC));
dpDesc.dwSize = sizeof(dpDesc);
dpDesc.guidSession = *DP_g_lpGuid;
dpDesc.dwFlags = DPOPEN_OPENSESSION;
dpDesc.dwSession = DP_EnumSessionCb[i].PointDPGameDesc.dwSession;
#ifdef DEBUG
OutputDebugString( "Step 8: Fall through, Open \n" );
#endif
hr = DP_lpIDC->/*lpVtbl->*/Open(//DP_lpIDC,
&dpDesc);
if (hr== DP_OK)
{
return (OK);
}
if (hr != DP_OK)
{
DP_lpIDC->/*lpVtbl->*/Close(/*DP_lpIDC*/);
DP_lpIDC->/*lpVtbl->*/Release(/*DP_lpIDC*/);
DP_lpIDC = NULL;
switch ( hr )
{
case DPERR_INVALIDPARAMS:
return( DP_ERROR_INVALID_PARAMS );
break;
case DPERR_GENERIC:
return( DP_ERROR_GENERIC );
break;
case DPERR_UNAVAILABLE:
return( DP_ERROR_UNAVAILABLE );
break;
case DPERR_UNSUPPORTED:
return( DP_ERROR_UNSUPPORTED );
break;
case DPERR_USERCANCEL:
return( DP_ERROR_USER_CANCEL );
break;
case DPERR_ACTIVEPLAYERS:
return( DP_ERROR_ACTIVE_PLAYERS );
break;
case DPERR_INVALIDOBJECT:
return( DP_ERROR_INVALID_OBJECT );
break;
}
return (OK);
}
return(TRUE);
}
//该函数是用来接收网络中的消息
int DP_ReceiveGameMessages( void )
{
DPID fromID, dcoReceiveID;
DWORD nBytes;
int i;
int j;
if ( DP_lpIDC )
{
// read all messages in queue
if(DP_MessageQueueFull==FULL)
{
#ifdef DEBUG
MessageBox(DP_hWndMain,"Message Queue Full!"," Error",MB_OK);
#endif
return (DP_MESSAGE_QUEUE_FULL);
}
HRESULT status;
nBytes = BUFFER_MAX_BYTE;
status = DP_lpIDC->/*lpVtbl->*/Receive(// DP_lpIDC,
&fromID,
&dcoReceiveID,
DPRECEIVE_ALL,
DP_ReadMessage,
&nBytes);
if((status==DP_OK)&&(fromID!=DP_dcoID))
{
if(((i=DP_AddPlayers(fromID))==DP_NOT_ADD_PLAYER)&&(j=DP_DestroyPlayers(fromID))==DP_NOT_DESTROY_PLAYER)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -