PHP Code:
/////////////////////////////////////////////////
//AuthServer v1.0
//Copyright Matheus Natario
////////////////////////////////////////////////
#include <winsock2.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <SQLAPI.h>
#pragma comment (lib, "Ws2_32.lib")
#pragma comment(lib, "SQLAPI.lib")
SAConnection g_saConnection;
#define DEFAULT_PORT 2000
#define DEFAULT_BUFFER 4096
int iPort = DEFAULT_PORT; // Port to listen for clients on
BOOL bInterface = FALSE, // Listen on the specified interface
bRecvOnly = FALSE; // Receive data only; don't echo back
char szAddress[128]; // Interface to listen for clients on
bool STAFF = false;
//
// Function: usage
//
// Description:
// Print usage information and exit
//
void usage()
{
printf("usage: server [-p:x] [-i:IP] [-o]\n\n");
printf(" -p:x Port number to listen on\n");
printf(" -i:str Interface to listen on\n");
printf(" -o Don't echo the data back\n\n");
ExitProcess(1);
}
//
// Function: ValidateArgs
//
// Description:
// Parse the command line arguments, and set some global flags
// to indicate what actions to perform
//
void ValidateArgs(int argc, char **argv)
{
int i;
for(i = 1; i < argc; i++)
{
if ((argv[i][0] == '-') || (argv[i][0] == '/'))
{
switch (tolower(argv[i][1]))
{
case 'p':
iPort = atoi(&argv[i][3]);
break;
case 'i':
bInterface = TRUE;
if (strlen(argv[i]) > 3)
strcpy(szAddress, &argv[i][3]);
break;
case 'o':
bRecvOnly = TRUE;
break;
default:
usage();
break;
}
}
}
}
//
// Function: ClientThread
//
// Description:
// This function is called as a thread, and it handles a given
// client connection. The parameter passed in is the socket
// handle returned from an accept() call. This function reads
// data from the client and writes it back.
//
DWORD WINAPI ClientThread(LPVOID lpParam)
{
SOCKET sock=(SOCKET)lpParam;
char szBuff[DEFAULT_BUFFER];
int ret,
nLeft,
idx;
while(1)
{
char ReturnValue[256];
// Perform a blocking recv() call
//
ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
if (ret == 0) // Graceful close
break;
else if (ret == SOCKET_ERROR)
{
printf("recv() failed: %d\n", WSAGetLastError());
break;
}
szBuff[ret] = '\0';
if(memcmp(szBuff, "@AutoBan",8)==0)
{
char Char[256];
char Motivo[256];
char AidSelect[256];
char BanQuery[256];
sscanf(szBuff, "@AutoBan %s %s", &Char, &Motivo);
//Busca AID
sprintf (AidSelect, "SELECT AID FROM Character WHERE Name = \'%s\'", Char);
SACommand SelectAID (&g_saConnection, AidSelect);
SelectAID.Execute();
while (SelectAID.FetchNext())
{
uint32_t szAID = 0;
szAID = SelectAID.Field("AID").asLong();
//Bane O Hack D:
sprintf (BanQuery, "UPDATE Account SET UGradeID = \'253\' WHERE AID = \'%i\'", szAID);
SACommand BanCommand (&g_saConnection, BanQuery);
BanCommand.Execute();
}
g_saConnection.Commit();
printf("AutoBan: User->%s Motivo->%s\n", Char, Motivo);
}
if(memcmp(szBuff, "@auth",5)==0)
{
char UserID[32];
char HDID[256];
int Version;
sscanf(szBuff, "@auth %s %s %d",&UserID,&HDID,&Version);
char Query1[256];
char Query2[256];
char Query3[256];
sprintf (Query1, "SELECT UGradeID FROM Account WHERE UserID = \'%s\'", UserID);
SACommand cmd(&g_saConnection, Query1);
try
{
// Select from our test table
cmd.Execute();
// fetch results row by row and print results
while(cmd.FetchNext())
{
uint32_t Grade = 0;
Grade = cmd.Field("UGradeID").asLong();
if(Grade == 255 || Grade == 254 || Grade == 252 )
{
sprintf (Query2, "SELECT HDID FROM STAFF WHERE UserID = \'%s\'", UserID);
SACommand sqlCommand2 (&g_saConnection, Query2);
sqlCommand2.Execute();
while (sqlCommand2.FetchNext())
{
SAString sHDID = sqlCommand2.Field("HDID");
if(sHDID == "")
{
sprintf(ReturnValue, "gmfail", szBuff);
}
else if(!(sHDID == HDID))
{
sprintf(ReturnValue, "gmfail", szBuff);
}
//printf("HDID: %s", sHDID);
STAFF = true;
}
if(STAFF == false)
{
sprintf(ReturnValue, "gmfail", szBuff);
}
}
}
// commit changes on success
g_saConnection.Commit();
}
catch(SAException &x)
{
// SAConnection::Rollback()
// can also throw an exception
// (if a network error for example),
// we will be ready
try
{
// on error rollback changes
g_saConnection.Rollback();
}
catch(SAException &)
{
}
// print error message
printf("%s\n", (const char*)x.ErrText());
}
//Registra HDID Na DB
sprintf (Query3, "UPDATE Login SET HDID = \'%s\' WHERE UserID = \'%s\'", HDID, UserID);
SACommand sqlCommand3 (&g_saConnection, Query3);
sqlCommand3.Execute();
STAFF = false;
//sprintf(ReturnValue, "gmfail", szBuff);
//printf("User %s: Login Autorizado!\n", UserID);
}
//sprintf(ReturnValue, "Dados Retornados!", szBuff);
//printf("RECV: %s\n", szBuff);
//
// If we selected to echo the data back, do it
//
if (!bRecvOnly)
{
nLeft = ret;
idx = 0;
//
// Make sure we write all the data
//
while(nLeft > 0)
{
//ret = send(sock, &szBuff[idx], nLeft, 0);
ret = send(sock, ReturnValue, nLeft, 0);
if (ret == 0)
break;
else if (ret == SOCKET_ERROR)
{
printf("send() failed: %d\n",
WSAGetLastError());
break;
}
nLeft -= ret;
idx += ret;
}
}
}
return 0;
}
//
// Function: main
//
// Description:
// Main thread of execution. Initialize Winsock, parse the
// command line arguments, create the listening socket, bind
// to the local address, and wait for client connections.
//
int main(int argc, char **argv)
{
SetConsoleTitleA("AuthServer v1.0 - Copyright Matheus Natario");
try
{
g_saConnection.Connect ("Driver={SQL Server};Server={MATHEUS-PC\\SQLEXPRESS}; Database={GunzDB}", "sa", "123456", SA_ODBC_Client);
}
catch (...)
{
MessageBoxA(NULL,"Erro ao conectar-se ao SQL Server.",NULL,NULL);
ExitProcess (0);
}
printf("AuthServer v1.0 Started!\n");
WSADATA wsd;
SOCKET sListen,
sClient;
int iAddrSize;
HANDLE hThread;
DWORD dwThreadId;
struct sockaddr_in local,
client;
ValidateArgs(argc, argv);
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("Failed to load Winsock!\n");
return 1;
}
// Create our listening socket
//
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sListen == SOCKET_ERROR)
{
printf("socket() failed: %d\n", WSAGetLastError());
return 1;
}
// Select the local interface and bind to it
//
if (bInterface)
{
local.sin_addr.s_addr = inet_addr(szAddress);
if (local.sin_addr.s_addr == INADDR_NONE)
usage();
}
else
local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(iPort);
if (bind(sListen, (struct sockaddr *)&local,
sizeof(local)) == SOCKET_ERROR)
{
printf("bind() failed: %d\n", WSAGetLastError());
return 1;
}
listen(sListen, 8);
//
// In a continous loop, wait for incoming clients. Once one
// is detected, create a thread and pass the handle off to it.
//
while (1)
{
iAddrSize = sizeof(client);
sClient = accept(sListen, (struct sockaddr *)&client,
&iAddrSize);
if (sClient == INVALID_SOCKET)
{
printf("accept() failed: %d\n", WSAGetLastError());
break;
}
printf("Cliente Aceito: %s:%d\n",
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
hThread = CreateThread(NULL, 0, ClientThread,
(LPVOID)sClient, 0, &dwThreadId);
if (hThread == NULL)
{
printf("CreateThread() failed: %d\n", GetLastError());
break;
}
CloseHandle(hThread);
}
closesocket(sListen);
WSACleanup();
return 0;
}
Credits: Matheus Natario