#ifndef __DBserver__
#define __DBserver__ 0
#include <winsock2.h>
#include <vector.h>
#include "Explode.h"
#include "PDataBase.h"
DATABASE *DB;
using namespace std;
class SCLIENT
{
SOCKET ClientSocket;
friend DWORD WINAPI ClientThread( void * pParam )
{
SCLIENT *temp = (SCLIENT *)pParam;
temp->Buffer = "";
while ( !temp->DeadlyIdleClient )
{
Sleep( temp->WaitTime );
if( temp->Buffer == "" )
{
temp->ReceiveData();
if( temp->WaitTime < 500 )
temp->WaitTime ++;
}
else
{
temp->DoAsk("");
temp->Buffer = "";
temp->WaitTime = 1;
}
}
return 0;
}
public:
bool Init(SOCKET SSocket,HWND &LogScr_ )
{
LogScreen = LogScr_;
SendMessageToHost("[LOG] Connected!\n");
ClientSocket = SSocket;
if (ClientSocket == INVALID_SOCKET) {
Disconnect();
DeadlyIdleClient = true;
Error( "Error Connecting client..." );
return WSAGetLastError();
}
int Data_Of_Thread_3 = 3;
ClientHandle = CreateThread( NULL, 0,ClientThread, (void *)this, 0, NULL);
DeadlyIdleClient = false;
Mutex = CreateMutex(
NULL, // default security attributes
FALSE, // initially not owned
"SCLIENT");
WaitTime = 1;
return true;
}
HWND LogScreen;
HANDLE ClientHandle;
HANDLE Mutex;
bool DeadlyIdleClient;
bool IWantMore;
string Buffer;
char *Text;
string DoAsk(string command);
bool SaveToErrorlog(char *str);
bool SaveToServerlog(char *str);
bool Disconnect();
bool SendData();
bool ReceiveData();
int WaitTime;
};
bool SCLIENT :: SaveToErrorlog(char *str)
{
FILE *LogFile;
LogFile = fopen("LOGS/errors.log","a+");
fputs( str,LogFile );
fclose(LogFile);
delete LogFile;
}
bool SCLIENT :: SaveToServerlog(char *str)
{
FILE *LogFile;
LogFile = fopen("LOGS/server.log","a+");
fputs( str,LogFile );
fclose(LogFile);
delete LogFile;
}
bool SCLIENT :: SendData( )
{
int iResult = send(ClientSocket,(char *)Buffer.c_str(),Buffer.size(),0);
if( WSAGetLastError() != 0 )
{
Disconnect();
}
else if( iResult == 0 )
{
return false;
}
else
return iResult;
}
bool SCLIENT :: ReceiveData()
{
char buf[65000] = "";
int iResult = recv(ClientSocket, buf, 65000, 0);
if( iResult == 0 || WSAGetLastError() != 0 )
{
Disconnect();
}
else
{
Buffer = buf;
return 0;
}
}
string SCLIENT :: DoAsk(string command = "")
{
vector <string> cmd;
cmd = Explode(command == "" ? Buffer : command," ");
if( cmd.size() == 0 )
return "";
if( cmd.at(0) == "CLOSECON" )
{
Disconnect();
cmd.clear();
return "[LOG] Disconnected!\n";
}
else if( cmd.at(0) == "ERROR" )
{
MessageBox(NULL, cmd.at(1).c_str() , "CLIENT ERROR" , MB_ICONERROR | MB_OK );
}
else if( cmd.at(0) == "DB_REQUEST" )
{
DWORD dwWaitResult = WaitForSingleObject(
Mutex, // handle to mutex
INFINITE);
if( dwWaitResult == WAIT_OBJECT_0 )
{
string ID = DB->Connect( cmd.at(1),cmd.at(2) );
if( ID == "ILLIGAL_ATTEMPT" )
{
string RetValue = "\n[ERROR] ILLIGAL ATTEMPT TO ACCES DB-SERVER : " + cmd.at(1) + "@" + cmd.at(2);
SendMessageToHost( (char *)RetValue.c_str() );
cmd.clear();
return "HALT";
}
vector <string> Requests = Explode(command == "" ? Buffer : command,"<=>");
if( Requests.size() > 1 )
{
vector <string> Query = DB->Command(ID, Requests.at(1) );
Buffer = "OK";
for(int i = 0;i < Query.size();)
{
//Error((char *)Buffer.c_str());
if( Buffer == "OK" )
{
Buffer = Query.at(i) == "" ? "NULL" : Query.at(i);
SendData();
Buffer = "";
ReceiveData();
i++;
}
}
Buffer = "EODBI";
SendData();
}
else
{
Buffer = "NO_CORRECT_REQUEST : Please ask your software distributor for solutions";
SendData();
ReceiveData();
if( Buffer == "OK" )
{
Buffer = "EODBI";
SendData();
}
}
Requests.clear();
ReleaseMutex(Mutex);
}
}
cmd.clear();
return "";
}
bool SCLIENT :: Disconnect()
{
closesocket(ClientSocket);
DeadlyIdleClient = true;
return 0;
}
class SSERVER
{
private:
WSADATA wsaData;
SOCKADDR_IN SocketAddres;
SOCKET Socket;
SOCKET ClientSocket;
char *Address;
int Port;
int MaximumConnections;
bool Server;
SCLIENT Temp;
vector<SCLIENT> ClientsVector;
public:
SSERVER(char b0,char b1,char b2,char b3,unsigned int port,int maxCons = 1,bool server = true)
{
MaximumConnections = maxCons;
_lastErrorCode = -1;
if( WSAStartup(MAKEWORD(2,2),&wsaData) != 0 )
{
_lastErrorCode = WSAGetLastError();
}
Socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if( Socket == INVALID_SOCKET )
{
_lastErrorCode = WSAGetLastError();
}
SocketAddres.sin_port = htons(port);
SocketAddres.sin_family = AF_INET;
if( b0 == 127 && b1 == 0 && b2 == 0 && b3 == 1 )
{
SocketAddres.sin_addr.S_un.S_un_b.s_b1 = 0;
SocketAddres.sin_addr.S_un.S_un_b.s_b2 = 0;
SocketAddres.sin_addr.S_un.S_un_b.s_b3 = 0;
SocketAddres.sin_addr.S_un.S_un_b.s_b4 = 0;
}
else
{
SocketAddres.sin_addr.S_un.S_un_b.s_b1 = b0;
SocketAddres.sin_addr.S_un.S_un_b.s_b2 = b1;
SocketAddres.sin_addr.S_un.S_un_b.s_b3 = b2;
SocketAddres.sin_addr.S_un.S_un_b.s_b4 = b3;
}
Server = server;
}
~SSERVER()
{
}
int _lastErrorCode;
char *ExplainError( int code );
bool Connect();
bool Listen(HWND &hwnd);
vector<char *> CommandList;
};
bool SSERVER :: Connect()
{
if( !Server )
{
ClientSocket = socket(AF_INET,SOCK_STREAM,0);
if( ClientSocket == INVALID_SOCKET ||
connect(ClientSocket,(SOCKADDR*)(&SocketAddres),sizeof(SocketAddres) ) == SOCKET_ERROR )
{
_lastErrorCode = WSAGetLastError();
return WSAGetLastError();
}
}
else
{
if( bind(Socket,(SOCKADDR*)(&SocketAddres),sizeof(SocketAddres) ) == SOCKET_ERROR )
{
_lastErrorCode = WSAGetLastError();
return WSAGetLastError();
}
bool bOptVal = true;
int bOptLen = sizeof(BOOL);
setsockopt(Socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOptVal, bOptLen);
}
return 0;
}
bool SSERVER :: Listen(HWND &hwnd)
{
if( Server )
{
listen(Socket,255);
while( true )
{
SOCKET ForClient = accept( Socket,NULL,NULL);
if( ForClient != INVALID_SOCKET )
{
Temp.Init(ForClient,hwnd );
ClientsVector.push_back( Temp );
}
}
}
}
char *SSERVER :: ExplainError( int code )
{
switch( code )
{
default : return "No error code like that in our register!\n";
}
}
#endif