📄 core_network.cpp
字号:
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 + -