You last visited: Today at 04:16
Advertisement
C++ Gameserver
Discussion on C++ Gameserver within the C/C++ forum part of the Coders Den category.
03/05/2014, 12:45
#1
elite*gold: 5
Join Date: Dec 2013
Posts: 683
Received Thanks: 56
C++ Gameserver
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:
Code:
Unbehandelte Ausnahme bei 0x0F43E7F9 (libmysql.dll) in Game server.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x000003B0
bezogen auf
Code:
if (mysql_query(Conn, qry.c_str()) == 0)
{
std::cout << "Error: " << mysql_error(Conn) << std::endl;
error = true;
}
der source
Database.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
Client.h
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
03/05/2014, 13:04
#2
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
Als Anfänger ist das auch nicht wirklich
der Einstiegspunkt in die Programmierung.
Zusätzlich würde ich noch den Einstieg in die Verwendung von Debuggern empfehlen.
Ich tippe übrigens mal auf ein fehlerhaftes Connectionhandle.
03/05/2014, 13:37
#3
elite*gold: 5
Join Date: Dec 2013
Posts: 683
Received Thanks: 56
Wie meinst das ? o:
03/05/2014, 13:51
#4
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
Wenn du dir unter fehlerhaftes Connectionhandle nichts vorstellen kannst, solltest du, sofern du ernsthaft an C++ interessiert bist, den Sourcecode wegwerfen und dir ein ordentliches Buch zulegen.
03/05/2014, 13:56
#5
elite*gold: 724
Join Date: Mar 2011
Posts: 10,478
Received Thanks: 3,318
Code:
mysql_query(Conn, qry.c_str()) == 0
Du hast hier keinen gültigen Zeiger auf eine MYSQL Struktur. Evtl. musst du erst "Connection" aufrufen?
03/05/2014, 16:52
#6
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,913
Received Thanks: 25,415
Erst die Sprache lernen.
Similar Threads
[Selling] Silver Hosting | Gameserver | ★Dein High-End Gameserver zum günstigen Preis★
02/25/2014 - elite*gold Trading - 25 Replies
Sehr geehrte Mitglieder von Elitepvpers,
hiermit möchten wir Ihnen High-End Gameserver zum günstigen Preis anbieten.
Gameserver - Multi Theft Auto
http://abload.de/img/mta_1h3d0k.png
Forum.Zap-Hosting.com - kostenlose Gameserver - Das Gameserver-Communityboard
08/28/2011 - Counter-Strike - 11 Replies
Forum.Zap-Hosting.com - Das Gameserver - Communityboard
http://zap-hosting.com/images/zapcommunity.png
Zum Board
Kostenlose Voice- und Gameserver! Wir sehen uns als das erste und einzige deutsche Forum in welchem die Communitymitglieder für das aktive Schreiben mit Voice- und Gameservern belohnt werden. Erarbeite dir deine ZAPs, werde reich und miete mit deinem Clan kostenlos einen Server.
Werde Admin von erfolgreichen oder geplanten Publicserverprojekten.
All times are GMT +2. The time now is 04:16 .