Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
344 lines
8.7 KiB
C++
344 lines
8.7 KiB
C++
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// ClientSocket Class
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
#include "LoginSocket.h"
|
|
|
|
#include <Network/Packet/PacketCommand.h>
|
|
#include <Network/Packet/PacketStruct/ServerInfo.h>
|
|
#include <Network/Packet/PacketStruct/ServerPacket.h>
|
|
#include <Network/Packet/PacketStruct/ClientToAuthServer.h>
|
|
#include <Network/Packet/PacketStruct/ClientToLoginServer.h>
|
|
|
|
LoginSocket::LoginSocket(HWND hWnd_In):
|
|
m_hMainWnd(hWnd_In), m_ConnectServer(0)
|
|
{
|
|
m_RegAddress.S_un.S_addr = 0;
|
|
}
|
|
|
|
LoginSocket::~LoginSocket(void)
|
|
{
|
|
Disconnect();
|
|
}
|
|
|
|
bool LoginSocket::ConnectToLoginServer(char* Address_In)
|
|
{
|
|
Disconnect();
|
|
|
|
if(!Socket::CreateTCPSocket(&m_TCPSocket, m_hMainWnd, WM_LOGIN_SOCKET))
|
|
return false;
|
|
|
|
m_ConnectServer = CO_SRV::CO_LOGIN;
|
|
return Socket::Connect(m_TCPSocket, Socket::MakeSockAddr(Address_In, DemonLoginTCPPort), &m_pRecvDataBuffer);
|
|
}
|
|
|
|
bool LoginSocket::ConnectToAuthServer(void)
|
|
{
|
|
Disconnect();
|
|
|
|
if(!Socket::CreateTCPSocket(&m_TCPSocket, m_hMainWnd, WM_LOGIN_SOCKET))
|
|
return false;
|
|
|
|
m_ConnectServer = CO_SRV::CO_AUTH;
|
|
return Socket::Connect(m_TCPSocket, Socket::MakeSockAddr(m_RegAddress, DemonAuthTCPPort), &m_pRecvDataBuffer);
|
|
}
|
|
|
|
bool LoginSocket::Disconnect(void)
|
|
{
|
|
if(m_TCPSocket)
|
|
Socket::DeleteSocket(&m_TCPSocket, m_hMainWnd);
|
|
|
|
return true;
|
|
}
|
|
|
|
//Interface/////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 핑 패킷 [ public ]
|
|
//
|
|
// Parameter :
|
|
//
|
|
// Return :
|
|
// 패킷 생성 후 보내기 성공시 true, 실패시 false
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
bool LoginSocket::SendSysPing(void)
|
|
{
|
|
if(m_TCPSocket == NULL)
|
|
return false;
|
|
|
|
CPacket* lpBuffer = new CPacket(sizeof(PktSyP), CmdSysPing, 0);
|
|
LPPktSyP lpSyPAckPt = reinterpret_cast<LPPktSyP>(lpBuffer->GetBuf());
|
|
|
|
lpSyPAckPt->m_dwTickTime = GetTickCount();
|
|
|
|
lpBuffer->WrapPacket(true);
|
|
if(!Send(m_TCPSocket, lpBuffer->GetWSABuf()))
|
|
{
|
|
lpBuffer->Release();
|
|
return false;
|
|
}
|
|
|
|
lpBuffer->Release();
|
|
return true;
|
|
}
|
|
|
|
//Interface/////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// GAS 유저 인증 [ public ]
|
|
// - GAS 서버로 유저 인증.
|
|
//
|
|
// Parameter :
|
|
// 1st : 유저 아이디 문자열[In] ex) "Bono"
|
|
// 2st : 유저 패스 워드 문자열[In] ex) "Bono"
|
|
// 3st : 클라이언트 버젼[In]
|
|
//
|
|
// Return :
|
|
// 패킷 생성 후 보내기 성공시 true, 실패시 false
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
bool LoginSocket::AuthAccount(char* UserID_In, char* UserPW_In, DWORD ClientVer_In, unsigned short CnFlag_In, unsigned short Flag_In)
|
|
{
|
|
if(m_TCPSocket == NULL || UserID_In == NULL || UserPW_In == NULL)
|
|
return false;
|
|
|
|
CPacket* lpBuffer = new CPacket(sizeof(PktAU), CmdAuthAccount, 0, CnFlag_In);
|
|
LPPktAU lpAUPt = reinterpret_cast<LPPktAU>(lpBuffer->GetBuf());
|
|
|
|
strncpy(lpAUPt->m_UserAccount, UserID_In, 16);
|
|
strncpy(lpAUPt->m_UserPassword, UserPW_In, 16);
|
|
|
|
lpAUPt->m_dwSessionID = GetDiskSerial('C');
|
|
|
|
lpAUPt->m_ClientVerInfo = ClientVer_In;
|
|
lpAUPt->m_cFlag = Flag_In;
|
|
|
|
lpBuffer->WrapPacket(true);
|
|
if(!Send(m_TCPSocket, lpBuffer->GetWSABuf()))
|
|
{
|
|
lpBuffer->Release();
|
|
return false;
|
|
}
|
|
|
|
lpBuffer->Release();
|
|
return true;
|
|
}
|
|
|
|
//Interface/////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 패킷 처리 [ public ]
|
|
// - AUAckPt 처리
|
|
//
|
|
// Parameter :
|
|
// 1st : 패킷 버퍼[In]
|
|
// 2st : 유저 고유 아이디 포인터[Out]
|
|
// 3st : 로그인 캐릭터 정보 구조체[Out]
|
|
//
|
|
// Return :
|
|
// 에러 코드
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD LoginSocket::HandleAuthAccount(char *pBuffer_In, DWORD *SessionID_Out, DWORD *UserID_Out)
|
|
{
|
|
LPPktAUAck lpAUAckPt = (LPPktAUAck)pBuffer_In;
|
|
|
|
if(lpAUAckPt == NULL || UserID_Out == NULL)
|
|
return WrongParameter;
|
|
|
|
*SessionID_Out = lpAUAckPt->m_dwSessionID;
|
|
*UserID_Out = lpAUAckPt->m_dwUserID;
|
|
|
|
if(lpAUAckPt->Error() != NoError)
|
|
return lpAUAckPt->Error();
|
|
|
|
return NoError;
|
|
}
|
|
|
|
//Interface/////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// GAS 서버 선택 [ public ]
|
|
// - GAS 서버 선택.
|
|
//
|
|
// Parameter :
|
|
// 1st : 유저 아이디[In]
|
|
// 2st : 서버 아이디[In]
|
|
//
|
|
// Return :
|
|
// 패킷 생성 후 보내기 성공시 true, 실패시 false
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
bool LoginSocket::ServerList(DWORD ClientVersion_In)
|
|
{
|
|
if(m_TCPSocket == NULL)
|
|
return false;
|
|
|
|
CPacket* lpBuffer = new CPacket(sizeof(PktSvL), CmdLoginServerList, 0, 0);
|
|
LPPktSvL lpSvLPt = reinterpret_cast<LPPktSvL>(lpBuffer->GetBuf());
|
|
|
|
lpSvLPt->m_ClientVerInfo = ClientVersion_In;
|
|
|
|
lpBuffer->WrapPacket(true);
|
|
if(!Send(m_TCPSocket, lpBuffer->GetWSABuf()))
|
|
{
|
|
lpBuffer->Release();
|
|
return false;
|
|
}
|
|
|
|
lpBuffer->Release();
|
|
return true;
|
|
}
|
|
|
|
//Interface/////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 패킷 처리 [ public ]
|
|
// - AUAckPt 처리
|
|
//
|
|
// Parameter :
|
|
// 1st : 패킷 버퍼[In]
|
|
// 2st : 유저 고유 아이디 포인터[Out]
|
|
// 3st : 로그인 캐릭터 정보 구조체[Out]
|
|
//
|
|
// Return :
|
|
// 에러 코드
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD LoginSocket::HandleServerList(char *pBuffer_In, DWORD *dwUserID_Out, SERVER_LIST* lpServerList_Out)
|
|
{
|
|
LPPktSvLAck lpSvLAckPt = (LPPktSvLAck)pBuffer_In;
|
|
|
|
if(lpSvLAckPt == NULL || dwUserID_Out == NULL)
|
|
return WrongParameter;
|
|
|
|
if(lpSvLAckPt->Error() != NoError)
|
|
return lpSvLAckPt->Error();
|
|
|
|
*dwUserID_Out = lpSvLAckPt->m_dwUserID;
|
|
CopyMemory(lpServerList_Out, &(lpSvLAckPt->m_ServerList), sizeof(SERVER_LIST));
|
|
|
|
return NoError;
|
|
}
|
|
|
|
//Interface/////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// GAS 서버 선택 [ public ]
|
|
// - GAS 서버 선택.
|
|
//
|
|
// Parameter :
|
|
// 1st : 유저 아이디[In]
|
|
// 2st : 서버 아이디[In]
|
|
//
|
|
// Return :
|
|
// 패킷 생성 후 보내기 성공시 true, 실패시 false
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
bool LoginSocket::ServerGroup(unsigned char Group_In)
|
|
{
|
|
if(m_TCPSocket == NULL)
|
|
return false;
|
|
|
|
CPacket* lpBuffer = new CPacket(sizeof(PktSG), CmdServerGroup, 0, 0);
|
|
LPPktSG lpSGPt = reinterpret_cast<LPPktSG>(lpBuffer->GetBuf());
|
|
|
|
lpSGPt->m_cGroup = Group_In;
|
|
|
|
lpBuffer->WrapPacket(true);
|
|
if(!Send(m_TCPSocket, lpBuffer->GetWSABuf()))
|
|
{
|
|
lpBuffer->Release();
|
|
return false;
|
|
}
|
|
|
|
lpBuffer->Release();
|
|
return true;
|
|
}
|
|
|
|
//Interface/////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 서버 선택 패킷 처리 [ public ]
|
|
// - AUTSAck 처리
|
|
//
|
|
// Parameter :
|
|
// 1st : 패킷 버퍼[In]
|
|
// 2st : 서버 아이디 포인터[Out]
|
|
//
|
|
// Return :
|
|
// 에러 코드
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD LoginSocket::HandleServerGroup(char *pBuffer_In, DWORD *dwServerID_Out)
|
|
{
|
|
LPPktSGAck lpSGAckPt = (LPPktSGAck)pBuffer_In;
|
|
|
|
if(lpSGAckPt == NULL || dwServerID_Out == NULL)
|
|
return WrongParameter;
|
|
|
|
if(lpSGAckPt->Error() != NoError)
|
|
return lpSGAckPt->Error();
|
|
|
|
*dwServerID_Out = lpSGAckPt->m_dwServerID;
|
|
m_RegAddress = lpSGAckPt->m_AuthAddress;
|
|
|
|
return NoError;
|
|
}
|
|
|
|
//Interface/////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 패치 주소 [ public ]
|
|
// - 패치 주소 얻기
|
|
//
|
|
// Parameter :
|
|
// 1st : 서버 아이디[In]
|
|
//
|
|
// Return :
|
|
// 패킷 생성 후 보내기 성공시 true, 실패시 false
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
bool LoginSocket::PatchAddress(DWORD ServerID_In)
|
|
{
|
|
if(m_TCPSocket == NULL)
|
|
return false;
|
|
|
|
CPacket* lpBuffer = new CPacket(sizeof(PktSPI), CmdSysPatchAddress, 0, 0);
|
|
LPPktSPI lpSPIPt = reinterpret_cast<LPPktSPI>(lpBuffer->GetBuf());
|
|
|
|
lpSPIPt->m_dwServerID = ServerID_In;
|
|
|
|
lpBuffer->WrapPacket(true);
|
|
if(!Send(m_TCPSocket, lpBuffer->GetWSABuf()))
|
|
{
|
|
lpBuffer->Release();
|
|
return false;
|
|
}
|
|
|
|
lpBuffer->Release();
|
|
return true;
|
|
}
|
|
|
|
//Interface/////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 패치 주소 [ public ]
|
|
// - 패치 주소 얻기
|
|
//
|
|
// Parameter :
|
|
// 1st : 패치 주소[In]
|
|
//
|
|
// Return :
|
|
// 에러 코드
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD LoginSocket::HandlePatchAddress(char *pBuffer_In, DWORD *ClientVer_Out, char *PatchAddress_Out)
|
|
{
|
|
LPPktSPIAck lpSPIAckPt = (LPPktSPIAck)pBuffer_In;
|
|
|
|
if(lpSPIAckPt == NULL)
|
|
return WrongParameter;
|
|
|
|
if(lpSPIAckPt->Error() != NoError)
|
|
return lpSPIAckPt->Error();
|
|
|
|
*ClientVer_Out = lpSPIAckPt->m_dwClientVer;
|
|
strncpy(PatchAddress_Out, lpSPIAckPt->m_PatchAddress, PktSPIAck::PATCH_ADDRESS_LENGTH);
|
|
|
|
return NoError;
|
|
}
|