DragonNest/Server/ServiceMonitorEx/Source/WinsockBase.hpp

332 lines
9.6 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
/*//===============================================================
<< WINSOCK BASE >>
PRGM : B4nFter
FILE : WINSOCKBASE.HPP
DESC : <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INIT BUILT DATE : 2005. 04. 28
LAST BUILT DATE : 2005. 04. 28
Copyright<EFBFBD><EFBFBD> 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved.
*///===============================================================
#pragma once
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
#include "ERRORFORMAT.H"
#include "SYSBASEBASE.H"
#include "IPV4.HPP"
#include <LIST>
///////////////////////////////////////////////////////////////////
// DEFINE
///////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
// DECLARATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CWinsockBase
//*---------------------------------------------------------------
// DESC : Winsock Base Socket Class
// PRGM : B4nFter
//*---------------------------------------------------------------
class CWinsockBase
{
public:
static enum {
EV_ERROR_NONE, // <20><><EFBFBD><EFBFBD> - none
EV_ERROR_SYSTEM, // <20><><EFBFBD><EFBFBD> - system
EV_ERROR_LOGIC // <20><><EFBFBD><EFBFBD> - logic
};
typedef std::list<std::string> TP_IPLIST;
typedef TP_IPLIST::iterator TP_IPLIST_ITR;
public:
inline CWinsockBase();
inline virtual ~CWinsockBase(); // P.S.> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (*.h, *.cpp <20><> <20>и<EFBFBD> <20>ʿ<EFBFBD>)
INT GetErrorCode() { return m_ErrorFormat.GetErrorCode(); }
inline static BOOL GetPhysicalAddress(LPBYTE lpbtPhysicalAddress);
inline static BOOL GetHostByName(LPCSTR lpszHostName, ULONG& uIpAddress);
inline static INT GetLocalIpAddressList(TP_IPLIST& pLocalIpAddressList);
inline static INT GetSockOpt(SOCKET pSocket, INT pLevel, INT pOptName, PCHAR pOptVal, PINT pOptLen);
inline static INT SetSockOpt(SOCKET pSocket, INT pLevel, INT pOptName, PCHAR pOptVal, INT pOptLen);
private:
inline BOOL Initialize();
inline VOID Finalize();
protected:
SOCKADDR_IN m_stSockAddr;
WSADATA m_stWsaData;
CErrorFormat m_ErrorFormat;
};
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CWinsockBase::CWinsockBase
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
CWinsockBase::CWinsockBase()
{
Initialize();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CWinsockBase::~CWinsockBase
//*---------------------------------------------------------------
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
CWinsockBase::~CWinsockBase()
{
Finalize();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CWinsockBase::Initialize
//*---------------------------------------------------------------
// DESC : <20><>ü <20><><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ
// PARM : N/A
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CWinsockBase::Initialize()
{
INT iErrNo = 0;
iErrNo = ::WSAStartup(MAKEWORD(2,2), & m_stWsaData);
if (iErrNo) {
switch (iErrNo) {
case WSASYSNOTREADY :
case WSAVERNOTSUPPORTED :
case WSAEINPROGRESS :
case WSAEPROCLIM :
case WSAEFAULT :
{
TCHAR szText[128] = { _T('\0'), };
SNPRINTF(MODE_DBG_EX(szText, COUNT_OF(szText)), COUNT_OF(szText), _T("CWinsockBase::Initialize() - WSAStartup() error : %d"), iErrNo);
m_ErrorFormat.Write(szText);
return FALSE;
}
}
}
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CWinsockBase::Finalize
//*---------------------------------------------------------------
// DESC : <20><>ü <20><><EFBFBD><EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
VOID CWinsockBase::Finalize()
{
::WSACleanup();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CWinsockBase::GetPhysicalAddress
//*---------------------------------------------------------------
// DESC : ȣ<><C8A3>Ʈ<EFBFBD><C6AE> <20><>Ʈ<EFBFBD><C6AE>ũ <20><><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD> (MAC) <20><> <20><><EFBFBD><EFBFBD>
// PARM : 1 . lpbtPhysicalAddress - ȣ<><C8A3>Ʈ<EFBFBD><C6AE> <20><>Ʈ<EFBFBD><C6AE>ũ <20><><EFBFBD><EFBFBD><EFBFBD>ּ<EFBFBD> (MAC) <20><> <20><><EFBFBD><EFBFBD> BYTE<54><EFBFBD><E8BFAD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>!!> . <20>ּ<EFBFBD> 6<><36><EFBFBD><EFBFBD>Ʈ <20>̻<EFBFBD>)
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CWinsockBase::GetPhysicalAddress(LPBYTE lpbtPhysicalAddress)
{
UUID stUuid;
INT iRetVal = ::UuidCreateSequential(&stUuid); // Ask OS to create UUID
if (iRetVal != RPC_S_OK) {
BASE_TRACE(_T("iRetVal != RPC_S_OK : %d - CWinsockBase::GetPhysicalAddress()"), iRetVal);
return FALSE;
}
for (INT iCount = 2 ; iCount<8 ; ++iCount) {
// UUID <20><> <20><><EFBFBD><EFBFBD> Data4 <20><> 2 ~ 7 <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>̰<EFBFBD> MAC <20>ּ<EFBFBD><D6BC>̴<EFBFBD>.
lpbtPhysicalAddress[iCount-2] = stUuid.Data4[iCount];
}
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CWinsockBase::GetHostByName
//*---------------------------------------------------------------
// DESC : IP <20≯<EFBFBD><CCB8><EFBFBD> dotted decimal <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> domain name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP4 <20>ּҷ<D6BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
// PARM : 1 . lpszHostName - domain name <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ȣ<><C8A3>Ʈ <20>ּ<EFBFBD>
// 2 . uIpAddress - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> IP4 ȣ<><C8A3>Ʈ <20>ּҸ<D6BC> <20><>ȯ<EFBFBD><C8AF> <20><><EFBFBD><EFBFBD>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
/* EXAM :
SOCKADDR_IN stSockAddr;
...
...
stSockAddr.sin_addr.s_addr = ::inet_addr(ipszAddress);
if (INADDR_NONE == stSockAddr.sin_addr.s_addr) {
if (TRUE == CWinsockBase::GetHostByName(ipszAddress, stSockAddr.sin_addr.s_addr)) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else {
// <20><><EFBFBD><EFBFBD>
}
}
*/
//*---------------------------------------------------------------
BOOL CWinsockBase::GetHostByName(LPCSTR lpszHostName, ULONG& uIpAddress)
{
LPHOSTENT lpstHostent;
lpstHostent = ::gethostbyname(lpszHostName);
if (lpstHostent) {
uIpAddress = ((LPIN_ADDR)lpstHostent->h_addr)->s_addr;
}
else {
return FALSE;
}
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CWinsockBase::GetLocalIpAddressList
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3>Ʈ<EFBFBD><C6AE> IP<49>ּ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD>
// PARM : 1 . pLocalIpAddressList - IP<49>ּ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޾ƿ<DEBE> <20><><EFBFBD><EFBFBD>Ʈ <20><>ü
// RETV : <20><><EFBFBD><EFBFBD>ȣ<EFBFBD><C8A3>Ʈ<EFBFBD><C6AE> IP<49>ּ<EFBFBD><D6BC><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ
// PRGM : B4nFter
//*---------------------------------------------------------------
INT CWinsockBase::GetLocalIpAddressList(TP_IPLIST& pLocalIpAddressList)
{
CHAR szHostName[128];
::gethostname(szHostName, sizeof(szHostName));
LPHOSTENT lpstHostent = ::gethostbyname(szHostName); // !!! <20><><EFBFBD>ܹ߻<DCB9> - 0x000006C5 (1733) <20>±װ<C2B1> Ʋ<><C6B2><EFBFBD>ϴ<EFBFBD>.
if (!lpstHostent) {
return 0;
}
LPIN_ADDR lpstInAddr;
std::string stTempIpAddress;
switch (lpstHostent->h_addrtype) {
case AF_INET :
while(NULL != (lpstInAddr = ((LPIN_ADDR)*lpstHostent->h_addr_list++))) {
stTempIpAddress = ::inet_ntoa(*lpstInAddr);
pLocalIpAddressList.push_back(stTempIpAddress);
}
break;
}
return (INT)pLocalIpAddressList.size();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CSessionBase::GetSockOpt
//*---------------------------------------------------------------
// DESC : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD> Ư<><C6AF> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . pSocket - <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 2 . pLevel - <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
/*
IPPROTO_IP
IPPROTO_IPV6
IPPROTO_TCP
IPPROTO_UDP
SOL_SOCKET
SOL_IRLMP
*/
// 3 . pOptName - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20≯<EFBFBD> (pLevel <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>)
// 4 . pOptVal - <20><>û<EFBFBD><C3BB> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 5 . pOptLen - <20><>û<EFBFBD><C3BB> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
// RETV : NOERROR - <20><><EFBFBD><EFBFBD> / <20>׿<EFBFBD> - <20><><EFBFBD><EFBFBD> (::WSAGetLastError() <20><>)
// PRGM : B4nFter
// P.S.>
// - <20>Ʒ<EFBFBD> MSDN URL <20><><EFBFBD><EFBFBD> getsockopt() <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
// http://msdn.microsoft.com/en-us/library/ms738544.aspx
//*---------------------------------------------------------------
INT CWinsockBase::GetSockOpt(SOCKET pSocket, INT pLevel, INT pOptName, PCHAR pOptVal, PINT pOptLen)
{
INT iRetVal = ::getsockopt(pSocket, pLevel, pOptName, pOptVal, pOptLen);
if (SOCKET_ERROR == iRetVal) {
BASE_RETURN(::WSAGetLastError());
}
return NOERROR;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CSessionBase::SetSockOpt
//*---------------------------------------------------------------
// DESC : <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> Ư<><C6AF> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . pSocket - <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// 2 . pLevel - <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
/*
IPPROTO_IP
IPPROTO_IPV6
IPPROTO_TCP
IPPROTO_UDP
SOL_SOCKET
SOL_IRLMP
*/
// 3 . pOptName - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɼ<EFBFBD><C9BC><EFBFBD> <20≯<EFBFBD> (pLevel <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٸ<EFBFBD><D9B8>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD>)
// 4 . pOptVal - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>
// 5 . pOptLen - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9>
// RETV : NOERROR - <20><><EFBFBD><EFBFBD> / <20>׿<EFBFBD> - <20><><EFBFBD><EFBFBD> (::WSAGetLastError() <20><>)
// PRGM : B4nFter
// P.S.>
// - <20>Ʒ<EFBFBD> MSDN URL <20><><EFBFBD><EFBFBD> setsockopt() <20>ɼ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
// http://msdn.microsoft.com/en-us/library/ms740476.aspx
//*---------------------------------------------------------------
INT CWinsockBase::SetSockOpt(SOCKET pSocket, INT pLevel, INT pOptName, PCHAR pOptVal, INT pOptLen)
{
INT iRetVal = ::setsockopt(pSocket, pLevel, pOptName, pOptVal, pOptLen);
if (SOCKET_ERROR == iRetVal) {
BASE_RETURN(::WSAGetLastError());
}
return NOERROR;
}