⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 core_network.cpp

📁 [游戏开发参考书-用DirectX编写RPG游戏]这是一个系列的丛书如果你都看并且懂的话你就可以你工作啦!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
      break;
    case DPN_MSGID_ASYNC_OP_COMPLETE:
      if(Network->AsyncOpComplete((DPNMSG_ASYNC_OP_COMPLETE *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_CLIENT_INFO:
      if(Network->ClientInfo((DPNMSG_CLIENT_INFO *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_CONNECT_COMPLETE:
      if(Network->ConnectComplete((DPNMSG_CONNECT_COMPLETE *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_CREATE_GROUP:
      if(Network->CreateGroup((DPNMSG_CREATE_GROUP *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_CREATE_PLAYER:
      if(Network->CreatePlayer((DPNMSG_CREATE_PLAYER *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_DESTROY_GROUP:
      if(Network->DestroyGroup((DPNMSG_DESTROY_GROUP *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_DESTROY_PLAYER:
      if(Network->DestroyPlayer((DPNMSG_DESTROY_PLAYER *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_ENUM_HOSTS_QUERY:
      if(Network->EnumHostsQuery((DPNMSG_ENUM_HOSTS_QUERY *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_ENUM_HOSTS_RESPONSE:
      if(Network->EnumHostsResponse((DPNMSG_ENUM_HOSTS_RESPONSE *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_GROUP_INFO:
      if(Network->GroupInfo((DPNMSG_GROUP_INFO *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_HOST_MIGRATE:
      if(Network->HostMigrate((DPNMSG_HOST_MIGRATE *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_INDICATE_CONNECT:
      if(Network->IndicateConnect((DPNMSG_INDICATE_CONNECT *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_INDICATED_CONNECT_ABORTED:
      if(Network->IndicatedConnectAborted((DPNMSG_INDICATED_CONNECT_ABORTED *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_PEER_INFO:
      if(Network->PeerInfo((DPNMSG_PEER_INFO *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_RECEIVE:
      if(Network->Receive((DPNMSG_RECEIVE *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_REMOVE_PLAYER_FROM_GROUP:
      if(Network->RemovePlayerFromGroup((DPNMSG_REMOVE_PLAYER_FROM_GROUP *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_RETURN_BUFFER:
      if(Network->ReturnBuffer((DPNMSG_RETURN_BUFFER *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_SEND_COMPLETE:
      if(Network->SendComplete((DPNMSG_SEND_COMPLETE *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_SERVER_INFO:
      if(Network->ServerInfo((DPNMSG_SERVER_INFO *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_TERMINATE_SESSION:
      if(Network->TerminateSession((DPNMSG_TERMINATE_SESSION *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
  }

  return E_FAIL;
}

cNetworkClient::cNetworkClient()
{
  m_pDPClient          = NULL;
  m_Connected          = FALSE;
  m_Port               = 0;
  m_IPAddress[0]       = 0;
  m_Name[0]            = 0;
  m_SessionName[0]     = 0;
  m_SessionPassword[0] = 0;
}

cNetworkClient::~cNetworkClient()
{
  Shutdown();
}

IDirectPlay8Client *cNetworkClient::GetClientCOM()
{
  return m_pDPClient;
}

BOOL cNetworkClient::Init()
{
  Shutdown();

  // Create the Client object
  if(FAILED(DirectPlay8Create(&IID_IDirectPlay8Client, (void**)&m_pDPClient, NULL)))
    return FALSE;

  return TRUE;
}

BOOL cNetworkClient::Shutdown()
{
  Disconnect();

  // Release Client object
  ReleaseCOM(m_pDPClient);

  // Clear all member variables to default
  m_pDPClient                = NULL;
  m_Connected          = FALSE;
  m_Port               = 0;
  m_IPAddress[0]       = 0;
  m_Name[0]            = 0;
  m_SessionName[0]     = 0;
  m_SessionPassword[0] = 0;

  return TRUE;
}

BOOL cNetworkClient::Connect(GUID *guidAdapter, char *IP, long Port, char *PlayerName, char *SessionName, char *SessionPassword)
{
  DPN_APPLICATION_DESC dpad;
  DPN_PLAYER_INFO      dppi;
  IDirectPlay8Address *pDPAddress, *pDPDevice;
  WCHAR wszPlayerName[MAX_PATH], wszIP[MAX_PATH];
  WCHAR wSessionName[MAX_PATH], wPassword[MAX_PATH];
  DPNHANDLE hAsync;

  Disconnect();

  // Do error checking
  if(m_pDPClient == NULL)
    return FALSE;
  if(SessionName == NULL || PlayerName == NULL)
    return FALSE;

  // Get port selection
  if(!(m_Port = Port))
    return FALSE;

  // Initialize the Client object
  if(FAILED(m_pDPClient->Initialize((PVOID)this, NetworkMessageHandler, 0)))
    return FALSE;

  // Assign client information
  ZeroMemory(&dppi, sizeof(DPN_PLAYER_INFO));
  dppi.dwSize = sizeof(DPN_PLAYER_INFO);
  dppi.dwInfoFlags = DPNINFO_NAME | DPNINFO_DATA;
  mbstowcs(wszPlayerName, PlayerName, strlen(PlayerName)+1); 
  dppi.pwszName = wszPlayerName;
  m_pDPClient->SetClientInfo(&dppi, NULL, NULL, DPNSETCLIENTINFO_SYNC);

  // Create address objects
  if(FAILED(DirectPlay8AddressCreate(&IID_IDirectPlay8Address, (void**)&pDPAddress, NULL)))
    return FALSE;
  if(FAILED(DirectPlay8AddressCreate(&IID_IDirectPlay8Address, (void**)&pDPDevice, NULL))) {
    pDPAddress->Release();
    return FALSE;
  }

  // Set protocols
  pDPAddress->SetSP(&CLSID_DP8SP_TCPIP);
  pDPDevice->SetSP(&CLSID_DP8SP_TCPIP);

  // Set the port - must not be 0
  if(FAILED(pDPAddress->AddComponent(DPNA_KEY_PORT, &m_Port, sizeof(DWORD), DPNA_DATATYPE_DWORD))) {
    pDPAddress->Release();
    return FALSE;
  }

  // Set the host
  mbstowcs(wszIP, IP, strlen(IP)+1);
  pDPAddress->AddComponent(DPNA_KEY_HOSTNAME, wszIP, (wcslen(wszIP)+1)*sizeof(WCHAR), DPNA_DATATYPE_STRING);

  // Set the adapter
  pDPAddress->AddComponent(DPNA_KEY_DEVICE, guidAdapter, sizeof(GUID), DPNA_DATATYPE_GUID);
  pDPDevice->AddComponent(DPNA_KEY_DEVICE, guidAdapter, sizeof(GUID), DPNA_DATATYPE_GUID);

  // Record the session Name and Password
  strcpy(m_SessionName, SessionName);
  mbstowcs(wSessionName, SessionName, MAX_PATH);
  if(SessionPassword != NULL) {
    strcpy(m_SessionPassword, SessionPassword);
    mbstowcs(wPassword, SessionPassword, MAX_PATH);
  }

  // Setup the application description structure
  ZeroMemory(&dpad, sizeof(DPN_APPLICATION_DESC));
  dpad.dwSize          = sizeof(DPN_APPLICATION_DESC);
  dpad.dwFlags         = DPNSESSION_CLIENT_SERVER;
  dpad.guidApplication = g_ApplicationGUID;
  dpad.pwszSessionName = wSessionName;
  if(SessionPassword != NULL) {
    dpad.pwszPassword = wPassword;
    dpad.dwFlags |= DPNSESSION_REQUIREPASSWORD;
  }

  // Connect
  if(FAILED(m_pDPClient->Connect(&dpad, pDPAddress, pDPDevice, NULL, NULL, NULL, 0, NULL, &hAsync, 0))) {
    pDPAddress->Release();
    pDPDevice->Release();
    return FALSE;
  }

  pDPAddress->Release();
  pDPDevice->Release();

  return TRUE;
}

BOOL cNetworkClient::Disconnect()
{
  // Perform disconnect
  if(m_pDPClient != NULL) {
    if(FAILED(m_pDPClient->Close(0)))
      return FALSE;
  }

  m_Connected          = FALSE;
  m_Port               = 0;
  m_IPAddress[0]       = 0;
  m_Name[0]            = 0;
  m_SessionName[0]     = 0;
  m_SessionPassword[0] = 0;

  return TRUE;
}

BOOL cNetworkClient::IsConnected()
{
  return m_Connected;
};

BOOL cNetworkClient::Send(void *Data, unsigned long Size, unsigned long Flags)
{
  DPNHANDLE       hAsync;
  DPN_BUFFER_DESC dpbd;

  // Error checking
  if(m_pDPClient == NULL)
    return FALSE;

  // Build a data structure
  dpbd.dwBufferSize = Size;
  dpbd.pBufferData  = (BYTE*)Data;

  m_pDPClient->Send(&dpbd, 1, 0, NULL, &hAsync, Flags);

  return TRUE;
}

BOOL cNetworkClient::SendText(char *Text, unsigned long Flags)
{
  DPNHANDLE       hAsync;
  DPN_BUFFER_DESC dpbd;

  // Error checking
  if(m_pDPClient == NULL)
    return FALSE;

  // Build a data structure
  dpbd.dwBufferSize = strlen(Text)+1;
  dpbd.pBufferData  = (BYTE*)Text;

  m_pDPClient->Send(&dpbd, 1, 0, NULL, &hAsync, Flags);

  return TRUE;
}

BOOL cNetworkClient::GetIP(char *IPAddress)
{
  WSADATA  WSAData;
  HOSTENT *HostEnt;
  char     LocalName[MAX_PATH], *LocalIP;
  in_addr *LocalIPAddr;

  if(WSAStartup(MAKEWORD(1,0), &WSAData))
    return FALSE;
  gethostname(LocalName, MAX_PATH);
  if((HostEnt = gethostbyname(LocalName)) == NULL) {
    WSACleanup();
    return FALSE;
  }
  LocalIPAddr = (in_addr*)HostEnt->h_addr_list[0];
  LocalIP = inet_ntoa(*LocalIPAddr);
  WSACleanup();

  if(LocalIP == NULL)
    return FALSE;

  strcpy(IPAddress, LocalIP);

  return TRUE;
}

long cNetworkClient::GetPort()
{
  return m_Port;
}

BOOL cNetworkClient::GetName(char *Name)
{
  if(Name == NULL)
    return FALSE;
  strcpy(Name, m_Name);
  return TRUE;
}

BOOL cNetworkClient::GetSessionName(char *Buf)
{
  if(Buf == NULL)
    return FALSE;
  strcpy(Buf, m_SessionName);
  return TRUE;
}

BOOL cNetworkClient::GetSessionPassword(char *Buf)
{
  if(Buf == NULL)
    return FALSE;
  strcpy(Buf, m_SessionPassword);
  return TRUE;
}

HRESULT WINAPI cNetworkClient::NetworkMessageHandler(PVOID pvUserContext, DWORD dwMessageId, PVOID pMsgBuffer)
{
  cNetworkClient *Network;
  DPNMSG_CONNECT_COMPLETE *pCCMsg;

  if((Network = (cNetworkClient*)pvUserContext) == NULL)
    return E_FAIL;

  switch(dwMessageId) {
    case DPN_MSGID_ADD_PLAYER_TO_GROUP:
      if(Network->AddPlayerToGroup((DPNMSG_ADD_PLAYER_TO_GROUP *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_ASYNC_OP_COMPLETE:
      if(Network->AsyncOpComplete((DPNMSG_ASYNC_OP_COMPLETE *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_CLIENT_INFO:
      if(Network->ClientInfo((DPNMSG_CLIENT_INFO *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_CONNECT_COMPLETE:
      // Update connection information
      pCCMsg = (DPNMSG_CONNECT_COMPLETE*)pMsgBuffer;
      if(pCCMsg->hResultCode == S_OK)
        Network->m_Connected = TRUE;

      if(Network->ConnectComplete((DPNMSG_CONNECT_COMPLETE *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_CREATE_GROUP:
      if(Network->CreateGroup((DPNMSG_CREATE_GROUP *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_CREATE_PLAYER:
      if(Network->CreatePlayer((DPNMSG_CREATE_PLAYER *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_DESTROY_GROUP:
      if(Network->DestroyGroup((DPNMSG_DESTROY_GROUP *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_DESTROY_PLAYER:
      if(Network->DestroyPlayer((DPNMSG_DESTROY_PLAYER *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_ENUM_HOSTS_QUERY:
      if(Network->EnumHostsQuery((DPNMSG_ENUM_HOSTS_QUERY *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_ENUM_HOSTS_RESPONSE:
      if(Network->EnumHostsResponse((DPNMSG_ENUM_HOSTS_RESPONSE *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_GROUP_INFO:
      if(Network->GroupInfo((DPNMSG_GROUP_INFO *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_HOST_MIGRATE:
      if(Network->HostMigrate((DPNMSG_HOST_MIGRATE *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_INDICATE_CONNECT:
      if(Network->IndicateConnect((DPNMSG_INDICATE_CONNECT *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_INDICATED_CONNECT_ABORTED:
      if(Network->IndicatedConnectAborted((DPNMSG_INDICATED_CONNECT_ABORTED *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_PEER_INFO:
      if(Network->PeerInfo((DPNMSG_PEER_INFO *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_RECEIVE:
      if(Network->Receive((DPNMSG_RECEIVE *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_REMOVE_PLAYER_FROM_GROUP:
      if(Network->RemovePlayerFromGroup((DPNMSG_REMOVE_PLAYER_FROM_GROUP *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_RETURN_BUFFER:
      if(Network->ReturnBuffer((DPNMSG_RETURN_BUFFER *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_SEND_COMPLETE:
      if(Network->SendComplete((DPNMSG_SEND_COMPLETE *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_SERVER_INFO:
      if(Network->ServerInfo((DPNMSG_SERVER_INFO *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
    case DPN_MSGID_TERMINATE_SESSION:
      Network->m_Connected = FALSE;
      if(Network->TerminateSession((DPNMSG_TERMINATE_SESSION *)pMsgBuffer) == TRUE)
        return S_OK;
      break;
  }

  return E_FAIL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -