Code:
Unbehandelte Ausnahme bei 0x0F43E7F9 (libmysql.dll) in Game server.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x000003B0
Code:
if (mysql_query(Conn, qry.c_str()) == 0)
{
std::cout << "Error: " << mysql_error(Conn) << std::endl;
error = true;
}
Database.h
Client.h
Code:
#ifndef DATABASE_H
#define DATABASE_H
#include "main.h"
class Database
{
public:
bool Connection(MYSQL *Conn, char *Host, char *User, char *Pass, char *Name, int s_Num)
{
return !mysql_real_connect(Conn, Host, User, Pass, Name, 0, NULL, 0) ? false : ResetUsers(s_Num) ? true : false;
}
bool UserSet(int s_Num, int Id, bool Online)
{
MYSQL_RES *res;
MYSQL_ROW row;
MYSQL *Conn;
using namespace std;
bool error = false;
mutex_db.lock();
MYSQL_RES *getQuery(MYSQL *Conn, std::string qry);
string qry = "SELECT users FROM server WHERE ID='" + IntegerToString(s_Num) + "'";
if (mysql_query(Conn, qry.c_str()) == 0)
{
std::cout << "Error: " << mysql_error(Conn) << std::endl;
error = true;
}
mutex_db.unlock();
if(error) return false;
res = mysql_store_result(Conn);
if(mysql_num_rows(res) != 1) return false;
int Users = 0;
while(row = mysql_fetch_row(res))
Users = atoi(row[0]);
mysql_free_result(res);
Online ? Users++ : Users--;
qry = "UPDATE server SET Users='" + IntegerToString(Users) + "' WHERE ID='" + IntegerToString(s_Num) + "'";
mutex_db.lock();
if(mysql_query(Conn,qry.c_str()) != 0)
{
std::cout << mysql_error(Conn);
error = true;
}
mutex_db.unlock();
if(error) return false;
std::string qry_o = Online ? IntegerToString(s_Num) : "0";
qry = "UPDATE account SET Online='" + qry_o + "' WHERE ID='" + IntegerToString(Id) + "'";
mutex_db.lock();
if(mysql_query(Conn,qry.c_str()) != 0)
{
std::cout << mysql_error(Conn);
error = true;
}
mutex_db.unlock();
return error ? false : true;
}
bool ResetUsers(int s_Num)
{
std::string qry = "UPDATE account SET Online='0' WHERE Online='" + IntegerToString(s_Num) + "'";
bool error = false;
mutex_db.lock();
if(mysql_query(Conn,qry.c_str()) != 0)
{
std::cout << mysql_error(Conn);
error = true;
}
mutex_db.unlock();
if(error) return false;
qry = "UPDATE server SET Users='0' WHERE ID='" + IntegerToString(s_Num) + "'";
mutex_db.lock();
if(mysql_query(Conn,qry.c_str()) != 0)
{
std::cout << mysql_error(Conn);
error = true;
}
mutex_db.unlock();
return error ? false : true;
}
};
#endif
Code:
#ifndef CLIENT_H
#define CLIENT_H
void client(void *id)
{
int n = int(id);
SOCKET Client = Connection[n];
char RecvData[4096+1], RecvData2[4096+1];
int Bytes = 0, Bytes2 = 0;
user User;
Game game;
Database db;
Selection selection;
Character chr;
bool log = false, preqLock = false;
try
{
Bytes = recv(Client,RecvData,4096,0);
RecvData[Bytes] = 0;
Bytes2 = recv(Client,RecvData2,4096,0);
RecvData2[Bytes2] = 0;
}
catch (...)
{
closesocket(Client);
Bytes = Bytes2 = -1;
}
if((Bytes >= 250 || Bytes <= 7) && (Bytes2 >= 260 || Bytes2 <= 7))
{
closesocket(Client);
}
else
{
User.Session = Session(RecvData);
User.iSession = StringToInteger(User.Session);
if(User.iSession >= 10000 && User.iSession <= 99999)
{
std::string Data = Decrypt(User.iSession,(unsigned char*)RecvData2,Bytes2);
std::vector<std::string> splData = split(Data, ' ');
User.Username = split(splData[1],(char)0xFF)[0];
User.Password = split(splData[2],(char)0xFF)[0];
if(!TryLogin(User))
{
closesocket(Client);
}
else
{
if(db.UserSet(1, User.Id, true))
{
pg[n].Online = -1;
selection.clist(n,User);
char *data = new char[4096+1];
Bytes = recv(Client,data,4096,0);
while(Bytes > 0)
{
std::string Packet = Decrypt(User.iSession, (unsigned char*)data, Bytes);
std::vector<std::string> splPacket = split(Packet, (char)0xFF);
std::vector<std::string> sTemp;
for(unsigned int i = 0; i < splPacket.size(); i++)
{
sTemp = split(splPacket[i], ' ');
if(sTemp.size() > 1)
{
if(sTemp[1] == "Char_NEW")
{
!log && sTemp.size() == 7 ? selection.CharNew(n, sTemp, User) : closesocket(Client);
}
else if(sTemp[1] == "Char_DEL")
{
!log && sTemp.size() == 4 ? selection.CharDel(n, sTemp, User) : closesocket(Client);
}
else if(sTemp[1] == "select")
{
if(!log && sTemp.size() == 3)
{
log = true;
pg[n].Online = 0;
selection.CharSelect(n,sTemp,User.Id,User.Type);
std::string credits = Encrypt("say 1 10007 10 ---------------------------------------------------------------------------------------------");
send(Client,credits.c_str(),credits.size(),0);
credits = Encrypt("say 1 10007 12 Text");
send(Client,credits.c_str(),credits.size(),0);
credits = Encrypt("say 1 10007 11 Text");
send(Client,credits.c_str(),credits.size(),0);
credits = Encrypt("say 1 10007 10 ---------------------------------------------------------------------------------------------");
send(Client,credits.c_str(),credits.size(),0);
credits = Encrypt("bn 0 [^Text^]");
send(Client,credits.c_str(),credits.size(),0);
credits = Encrypt("bn 1 [^Text^]");
send(Client,credits.c_str(),credits.size(),0);
credits = Encrypt("bn 2 [^Text^]");
send(Client,credits.c_str(),credits.size(),0);
}
else
{
closesocket(Client);
}
}
else if(sTemp[1] == "walk")
{
if(log && sTemp.size() == 6)
{
preqLock = false;
chr.Walk(n,sTemp,User.Type);
}
else
{
closesocket(Client);
}
}
else if(sTemp[1] == "say")
{
log && sTemp.size() > 2 ? chr.Say(sTemp, n, User.Block) : closesocket(Client);
}
else if(sTemp[1] == "guri")
{
if(log && sTemp.size() == 6) if(sTemp[2] == "10" && sTemp[3] == "1") chr.Emoticon(sTemp, n);
}
else if(sTemp[1] == "preq")
{
if(log) { if(!preqLock) game.preq(User.Type, n, pg) ? preqLock = true : closesocket(Client); } else { closesocket(Client); }
}
else if(sTemp[1] == "ncif")
{
log && sTemp.size() == 4 ? game.St(n, sTemp) : closesocket(Client);
}
else if(sTemp[1] == "rest")
{
if(log && sTemp.size() == 5)
{
if(sTemp[2] == "1" && sTemp[3] == "1") game.Rest(sTemp[4], n) ? chr.SetIn(User.Type,n) : closesocket(Client);
}
else
{
closesocket(Client);
}
}
else if(sTemp[1] == "dir")
{
if(log && sTemp.size() == 5)
{
sTemp[3] == "1" ? game.Dir(n,sTemp[2],sTemp[4],User.Type) : closesocket(Client);
}
else
{
closesocket(Client);
}
}
else if(sTemp[1] == "$shutdown")
{
if(cm_Shutdown_Enabled == 1 && User.Type == cm_Shutdown_Rank && sTemp.size() == 3 && sTemp[2] == cm_Shutdown_Password) { Command cm; cm.Shutdown(); }
}
else if(sTemp[1] == "u_s")
{
if(log && sTemp.size() == 5)
{
game.Attack(User.Type, sTemp[2], sTemp[4], n, sTemp[3]);
}
else
{
closesocket(Client);
}
}
}
}
Bytes = recv(Client, data, 4096, 0);
}
pg[n].Online = -1;
if(log)
{
std::string out = Encrypt("out 1 " + IntegerToString(pg[n].Number));
for(int i = 0; i < clients; i++) { if(pg[i].Online == 0 && pg[i].Map == pg[n].Map && pg[i].Number != pg[n].Number) send(Connection[i],out.c_str(),out.size(),0); }
std::string qry = "UPDATE characters SET Map='" + IntegerToString(pg[n].Map) + "', X='" + IntegerToString(pg[n].X) + "', Y='" + IntegerToString(pg[n].Y) + "', Z='" + IntegerToString(pg[n].Z) + "', Level='" + IntegerToString(pg[n].Level) + "', Exp_Points='" + IntegerToString(pg[n].Exp_Points) + "', Job='" + IntegerToString(pg[n].Job) + "', Job_Points='" + IntegerToString(pg[n].Job_Points) + "' WHERE ID='" + IntegerToString(User.Id) + "' AND Number='" + IntegerToString(pg[n].Number) + "'";
mutex_db.lock();
if(mysql_query(Conn,qry.c_str()) != 0)
{
std::cout << mysql_error(Conn) << std::endl;
}
mutex_db.unlock();
}
db.UserSet(1,User.Id,false);
}
else
{
closesocket(Client);
}
}
}
}
_endthread();
}
#endif






