📄 cusemoney.cpp
字号:
//#include "stdafx.h"
#include "CUseMoney.h"
//#include <winsock2.h>
const char CAsyncClient::dvHeader = '\035';
const char CAsyncClient::dvWord = '\t' ;
const char* CAsyncClient::dvNull = "\0";
const char* CAsyncClient::SERVER_NAME = "DR";
const char* CAsyncClient::GAME_ID = "2";
const char* CAsyncClient::USER_TYPE = "1";
CAsyncClient g_cAsyncPay;
void RecvReponseGUMP( SOCKET socket );
void LeaveLogInText( const char* szMsg );
extern void SendCMD_CONNECT_AGENT_SERVER_CONFORM(const DWORD dwUserID, const char* szUserName, const int nResult);
extern HWND m_hProcWnd;
extern void KickOffUser( char* szUserID ); // 030716 kyo
BOOL DumpException(LPEXCEPTION_POINTERS lpExcep,char* szOutMsg, void *pData=0, int nSize=0 );
// FindUser
struct IsUserHere : binary_function<USERINFOPAY, char*, bool>
{
public:
bool operator()(const USERINFOPAY& rUserInfo, const char* szName) const
{
return ( strcmp( rUserInfo.szUserId, szName) == 0) ? true:false;
}
};
#define WM_SOCKET_EVENT WM_USER+100
#define KEEP_ALIVE_TIME 60*1000
LRESULT CALLBACK MessageProc( HWND hwnd, UINT uMessage, WPARAM wParam, LPARAM lParam )
{
if( WM_CREATE == uMessage )
{
SetTimer( hwnd, 1, KEEP_ALIVE_TIME, NULL );
return 0;
}
if( WM_TIMER == uMessage )
{
g_cAsyncPay.SendKeepaliveMsg();
return 0;
}
if( WM_USER_ALIVE_PAY == uMessage )
{ // 030630 kyo
MyLog( 0, "@-----------------ALive PayThread-----------------@");
MyLog( 0, "@-----------------ALive PayThread-----------------@");
MyLog( 0, "@-----------------ALive PayThread-----------------@");
return 0;
}
if( WM_SOCKET_EVENT == uMessage )
{
//switch( LOWORD(lParam) )
if( WSAGETSELECTERROR(lParam) )
{
MyLog( 0, "/////////////////////////////////////");
MyLog( 0, "ERROR ::: Receive Error Msg = %d ",WSAGetLastError()); // 030630 kyo
MyLog( 0, "/////////////////////////////////////");
//closesocket( (SOCKET) wParam); // 030701
return 0;
}
switch( WSAGETSELECTEVENT(lParam) )
{
case FD_ACCEPT:
{
break;
}
case FD_READ:
{
RecvReponseGUMP( (SOCKET)wParam);
break;
}
case FD_WRITE:
{
//int nRet = send( (SOCKET) wParam, "client", 3,0);
break;
}
case FD_CLOSE:
{
//cout << "close " << wParam <<endl; //辑滚啊 场绢柳巴篮 犬牢等促.
break;
}
case FD_CONNECT:
{
//g_bConnect = true;
//cout << "connect " << endl;
break;
}
default:
{
break;
}
}
}
return 1;
}
void RecvReponseGUMP( SOCKET socket )
{//皋矫瘤甫 皋矫瘤 惑磊俊 持绰促.
//罐篮 皋矫瘤甫 盒籍茄促.
char szMsg[100];
g_cAsyncPay.RecvResponsMessage( socket, szMsg ) ;
if( !szMsg) return;
if( 0 >= strlen( szMsg ) )
{
return;
}
g_cAsyncPay.AnalysysMessage( szMsg );
//LeaveLogInText( szMsg );
MyLog( 0, "%s", szMsg );
}
void LeaveLogInText( const char* szMsg )
{
//弊朝 朝楼尔 矫埃捞尔
time_t nowTime;
//static int log_year = 0, log_mon = 0, log_day = 0;
time( &nowTime );
struct tm *now;
now = localtime(&nowTime);
int year, mon, day, hour, min, sec;
year = now->tm_year + 1900;
mon = now->tm_mon + 1;
day = now->tm_mday;
hour = now->tm_hour;
min = now->tm_min;
sec = now->tm_sec;
char szFilename[0xff];
sprintf( szFilename, "./Paylog/%d_%d_%d.log", year,mon, day );
FILE *fp;
if( NULL ==(fp= fopen( szFilename, "a")) )
{
return;
}
//char msg[0xff];
//sprintf( msg, "%d:%d:%d\t%s\n", hour, min, sec, szMsg );
//fprintf( fp, msg );
fprintf( fp, "%d:%d:%d\t%s\n", hour, min, sec, szMsg );
fclose( fp );
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//CAsyncClient
CAsyncClient::CAsyncClient()
{
strcpy( m_strServerName, "DR" ); //辑滚捞抚
m_nServerGroupNum = 1; //辑滚弊缝锅龋
strcpy( m_szServerNum, "000.000.000.000"); //辑滚锅龋
m_nZoneNum = 1; //粮 锅龋
InitializeCriticalSection( &m_cs );
}
CAsyncClient::CAsyncClient( const char* strName, const int nGrup, const char* szServerNum, const int nZone)
{
strcpy( m_strServerName, strName ); //辑滚捞抚
m_nServerGroupNum = nGrup; //辑滚弊缝锅龋
strcpy( m_szServerNum, szServerNum ); //辑滚锅龋
m_nZoneNum = nZone; //粮 锅龋
InitializeCriticalSection( &m_cs );
}
CAsyncClient::~CAsyncClient()
{
//LogoutAllUser();
CloseConnection();
DeleteCriticalSection( &m_cs );
}
void CAsyncClient::SetAgentInfo( const char* szName, const int nGroup, const char* szServerNum, const int nZone )
{
strcpy( m_strServerName, szName ); //辑滚捞抚
m_nServerGroupNum = nGroup; //辑滚弊缝锅龋
strcpy( m_szServerNum, szServerNum ); //辑滚锅龋
m_nZoneNum = nZone; //粮 锅龋
}
SOCKET CAsyncClient::InitSocket( const char* szIP, const int nPort )
{
WSADATA wsaData = {0,};
if(::WSAStartup(WINSOCK_VERSION, &wsaData))//胶鸥飘诀
{
const int nError = ::WSAGetLastError();
ShowError( nError );
return -1;
}
//get Ip and port Number
m_sSocket = ::WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL,//TCP/IP 牢磐齿 家南
SG_UNCONSTRAINED_GROUP, WSA_FLAG_OVERLAPPED);
if (m_sSocket== INVALID_SOCKET)
{
const int nError = ::WSAGetLastError();
ShowError( nError );
return -1;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons( nPort );
addr.sin_addr.s_addr= inet_addr( szIP );
if(connect( m_sSocket, (LPSOCKADDR)&addr, sizeof(addr)) < 0)
{
const int nError = ::WSAGetLastError();
ShowError( nError );
return -1;
}
return m_sSocket;
}
const char* INI_PATH ="./AgentServer.ini";
int CAsyncClient::InitConnectPayServer()
{// 苞陛辑滚俊霸 Initialized Message甫 焊辰促.
//61.251.171.11捞备夸 器飘绰 1071涝聪促.
//ini俊辑 蔼阑 罐酒柯促.
char szIP[50];
char szServerNum[50];
char szHeader[50];
char szVer[50];
if( !::GetPrivateProfileString( "PayInfo", "GumServerIp", "" , szIP, 50, INI_PATH ) )
return -1;
const int nPort = ::GetPrivateProfileInt( "PayInfo", "GumServerPort", 0, INI_PATH );
::GetPrivateProfileString( "PayInfo", "Header", "" , szHeader, 50, INI_PATH );
::GetPrivateProfileString( "PayInfo", "Version", "" , szVer, 50, INI_PATH );
const int nGroupNum = ::GetPrivateProfileInt( "PayInfo", "ServerSetNum", 0 , INI_PATH );
::GetPrivateProfileString( "Server_info", "own_server_ip_for_server", "" , szServerNum, 50, INI_PATH );
const int nZoneNum = ::GetPrivateProfileInt( "Server_info", "own_server_port_for_server", 0 , INI_PATH );
//Set
m_sSocket = InitSocket( szIP, nPort );
SetCurrentState( GUM_STATE_INIT );
SetGumHeader( szHeader, szVer );
SetAgentInfo( SERVER_NAME, nGroupNum, szServerNum, nZoneNum );
//m_szGumHeader = "GUMP/1.2";
m_hProcWnd = CreateMsgWindow( (WNDPROC)MessageProc );
if( NULL == m_hProcWnd )
{
return -1;
}
int nRet = WSAAsyncSelect( m_sSocket, m_hProcWnd, WM_SOCKET_EVENT, FD_READ| FD_CLOSE );
if( SOCKET_ERROR == nRet)
{
const int nError = ::WSAGetLastError();
ShowError( nError );
return -2;
}
return SendInitialMsg2PayServer();
}
int CAsyncClient::SendInitialMsg2PayServer()
{
char szInitMsg[0xff];
//sprintf( szInitMsg, "%s\t0\0351\t%s\t%d\t%s\t%d\t\0", m_szGumHeader, m_strServerName, m_nServerGroupNum, m_szServerNum, m_nZoneNum);
sprintf( szInitMsg, "%s\t0\0351\t%s\t%d\t%d\t%d\t\0", m_szGumHeader, m_strServerName, m_nServerGroupNum, m_nZoneNum, m_nZoneNum);
int nLen = strlen( szInitMsg );
int nRet = SendPayFormatMessage( szInitMsg );
if( SOCKET_ERROR == nRet)
{
const int nError = ::WSAGetLastError();
ShowError( nError );
return -1;
}
return nRet;
}
int CAsyncClient::AnalysysMessage( char* szMsg )
{// 罐篮 皋矫瘤甫 盒籍秦辑 府畔茄促.
// 罐篮 荤捞令焊促 逞绢啊搁 救等促. 唱吝俊 犬牢
char szNull[2] = {'\t','\0'};
if( NULL == strstr( szMsg, szNull ) )
{
return -1; //肋给等 巩磊
}
//Analy Header
int nSeqNum=0;
char *pMsgBody = AnalysysMsgHeader( szMsg, nSeqNum );
if( NULL == pMsgBody )
{//瘤沥等 Seq锅龋啊 酒聪芭唱 庆歹啊 撇府搁
return -1;
}
//Analy Body
int nRestTime=0;
USERINFOPAY userInfo;
int nMsgType = AnalysysMsgBody( pMsgBody, userInfo, nRestTime );
if( !IsRightType( nMsgType ) )
{
return -1;
}
switch( nMsgType )
{
case GUM_MSG_INIT_FAIL:
{
SetCurrentState( GUM_STATE_INIT );
//leave Log
//Exit Program
}break;
case GUM_MSG_MESSAGEFORM_WRONG:
{//肋给等 屈侥狼 皋矫瘤
break;
}
case GUM_MSG_RESPONS_INITALIZED:
{
SetCurrentState( GUM_STATE_RUNNING );
break;
}
case GUM_MSG_LOGIN_SUCCESS:
{
RecvUserLogin( userInfo );
break;
}
case GUM_MSG_WRONG_PASS:
case GUM_MSG_HAVENO_AUTHORITY:
case GUM_MSG_END_OF_DATE :
case GUM_MSG_ALREADY_LOGIN :
case GUM_MSG_ALL_SPEND_IP :
case GUM_MSG_DISCONNECT_USER:
case GUM_MSG_END_OF_DATE_1DAY:
case GUM_MSG_END_OF_DATE_1DAY2:
{
RecvUserLoginFail( userInfo, nMsgType );
break;
}
case GUM_MSG_LOGOUT_SUCCESS :
{
RecvUserLogout( userInfo );
break;
}
case GUM_MSG_LOGOUT_FAIL:
{
RecvUserLogoutFail( userInfo );
}
case GUM_MSG_USER_TIMEOVER :
case GUM_MSG_USER_TIMEOVER_1DAY :
case GUM_MSG_USER_TIMEOVER_1DAY2:
{
RecvUserAlert( userInfo, nRestTime );
break;
}
case GUM_MSG_USER_DIS_TIMEOVER :
case GUM_MSG_USER_DIS_TIMEOV_1D :
case GUM_MSG_USER_DIS_TIMEOV_1D2:
case GUM_MSG_USER_DIS_OUSER_REQ :
{
RecvUserDisconnect( userInfo, nMsgType);
}
default:
{
//Leave Log
break;
}
}
return 0;
}
int CAsyncClient::AnalysysMsgHeader( char* szMsg )
{// analysys Header
int i=0;
while( 0x09 != *szMsg )//1.
{
if( m_szGumHeader[i++] != *szMsg++ )
{//肋给等 秦歹
return -10;
}
if( NULL == *(szMsg+1) )
{//罐篮 荤捞令甫 逞绢啊绰芭
return -20;
}
}
*szMsg++;
char *pSeqNum = new char[4]; //pSeqNum篮 焊扁俊 鞘夸啊 绝促.
char *pCurrentPos = pSeqNum;
while (0x1D != *szMsg)//2.
{
*pSeqNum++ = *szMsg++;
if( NULL == *(szMsg+1) )
{//罐篮 荤捞令甫 逞绢啊绰芭
return -20;
}
//叼滚弊葛靛老订 八荤甫 歹 沥剐窍霸
}
*pSeqNum = '\0';
int nSeq = atoi( pCurrentPos);
delete pCurrentPos;
//delete [] pCurrentPos;
return nSeq;
}
char* CAsyncClient::AnalysysMsgHeader( char* szMsg, int& nSeq )
{// analysys Header
int i=0;
while( 0x09 != *szMsg )
{
if( m_szGumHeader[i++] != *szMsg++ )
{//肋给等 秦歹
return NULL;
}
if( NULL == *(szMsg+1) )
{//罐篮 荤捞令甫 逞绢啊绰芭
return NULL;
}
}
*szMsg++;
char *pSeqNum = new char[4]; //pSeqNum篮 焊扁俊 鞘夸啊 绝促.
char *pCurrentPos = pSeqNum;
while (0x1D != *szMsg)//2.
{
*pSeqNum++ = *szMsg++;
if( NULL == *(szMsg+1) )
{//罐篮 荤捞令甫 逞绢啊绰芭
return NULL;
}
//叼滚弊葛靛老订 八荤甫 歹 沥剐窍霸
}
*pSeqNum = '\0';
nSeq = atoi( pCurrentPos);
//delete [] pCurrentPos;
delete pCurrentPos;
*szMsg++;
return szMsg;
}
char* CAsyncClient::AnalysysMsgType( char* szMsgBody, int& nType )
{
char *pMsgType = new char[4];
char *pCurrentPos = pMsgType;
while( 0x09 != *szMsgBody ) //3.
{
if( 0x00 == *szMsgBody)
{
return NULL;
}
*pMsgType++ = *szMsgBody++;
}
*pMsgType = '\0';
nType = atoi( pCurrentPos );
delete pCurrentPos;
//delete [] pCurrentPos;
*szMsgBody++;
return szMsgBody;
}
int CAsyncClient::AnalysysMsgBody( char* szMsgBody , USERINFOPAY& userInfo, int& nRestTime)
{
char *pMsgType = new char[4];
char *pCurrentPos = pMsgType;
while( 0x09 != *szMsgBody ) //3.
{
if( 0x00 == *szMsgBody)
{
return NULL;
}
*pMsgType++ = *szMsgBody++;
}
*pMsgType = '\0';
int nType = atoi( pCurrentPos );
//delete [] pCurrentPos;
delete pCurrentPos;
*szMsgBody++;
if( 0x00 == *szMsgBody)
{
return nType;
}
static int nIdx = 0;
nIdx =0;
char *pToken = new char[0xff];
char *pCurrentPos2 = pToken;
while( 4 > nIdx )
{
*pToken++ = *szMsgBody++;
if( 0x00 == *szMsgBody)
{
break;
}
if( 0x09 == *szMsgBody)
{
switch( nIdx )
{
case 0:
{
*pToken = '\0';
strcpy( userInfo.szGameId, pCurrentPos2 );
break;
}
case 1:
{
*pToken = '\0';
strcpy( userInfo.szUserId, pCurrentPos2 );
break;
}
case 2:
{
*pToken = '\0';
strcpy( userInfo.szUserType, pCurrentPos2 );
break;
}
case 3:
{
*pToken = '\0';
nRestTime = atoi( pCurrentPos2 );
//strcpy( userInfo.szUserType, pCurrentPos );
break;
}
default:
{
break;
}
}
//strcpy( userInfo.szGumUser[nIdx], szToken );
pToken = pCurrentPos2;
nIdx++;
*szMsgBody++;
}
}
if( 1<strlen(pCurrentPos2) )
{
delete [] pCurrentPos2;
}
else
delete pCurrentPos2;
//if( 0x00 == *++szMsgBody)
//{
//return 0;
//}
return nType;
}
HWND CAsyncClient::CreateMsgWindow( WNDPROC messageproc)
{
WNDCLASS wndClass;
ZeroMemory( &wndClass, sizeof(wndClass) );
HINSTANCE hInst = (HINSTANCE)GetModuleHandle(NULL);
wndClass.style = CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = messageproc;
wndClass.hInstance = hInst;
wndClass.lpszClassName = m_strServerName;
if(RegisterClass(&wndClass) == 0)
{
return NULL;
}
HWND hWnd = CreateWindowEx(WS_EX_TOPMOST, m_strServerName, m_strServerName, WS_POPUP|WS_OVERLAPPED, 0, 0, 100, 100, NULL, NULL, hInst, NULL);
return hWnd;
}
int CAsyncClient::AddPayUser( USERINFOPAY& stUser )
{
LISTUSERIT it = FindUserIterator( stUser.szUserId );
if( it != NULL )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -