Da ich eig. ein Anfänger bin in c++ ect. habe ich mir ein source code für ein GameServer geben lassen zum üben und basteln nun komm ich aber nicht weiter nach Server und Channel auswahl stopt Visual Studio das debuggen und sagt das hier:
bezogen auf
der source
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