E
So jetzt bin ich auch mal wieder an meinem Rechner und eingeloggt, also hier der Code, der Teil des Code der mit "//" ausgeschaltet ist funktioniert einwandfrei, jedoch belegt mein Programm mit statisch angelegten Char Arrays in etwa 220MB Speicher, das ist halt net so toll, und im Normalfall (das Struct ist auf 10240 Server ausgelegt) werden nur ca. 1500 abgefragt und da sind wiederum nur ein kleiner Teil der CVAR und Player Datenfelder benutzt. Wie gesagt wenn ich 2 Versionen kompiliere läuft die statische über Stunden hinweg mit permanentem Serverscan von 50Server/Sec stabil durch. Die andere läuft einmalkomplett durch ohne Fehlermeldung, beim zweiten Durchgang crasht dann das Programm.
zuerst die Headerdatei:
typedef struct{
// char name[64]; //damit geht es
// char value[64]; //damit geht es
char *name;
char *value;
}cvar_t;
typedef struct{
// char playername[64]; //damit geht es
// char team[64]; //damit geht es
char *playername;
char *team;
u_short ping;
short score;
}playerinfo_t;
typedef struct{
char servername[64];
char mapname[64];
char modname[64];
char keywords[64];
char version[16];
u_int ip;
u_short port;
u_short country_id;
int id;
u_short cur_clients;
u_short max_clients;
u_short ping;
u_short protocol;
u_short num_of_cvars;
boolean need_password;
boolean punkbuster;
boolean responding;
double start_scantime;
double last_scantime;
playerinfo_t players[127]; //struct von oben
cvar_t cvars[64]; //struct von oben
}serverinfo_t;
extern serverinfo_t serverinfo[10240];
Hier die C-Datei:
serverinfo_t serverinfo[10240];
void Startfunktion(void){ //wird nur einmal beim Start aufgerufen
memset( &serverinfo, 0, sizeof(serverinfo));
}
void Divide_CVARs(int server_id, char recvBuff[16384]){
char *pch;
char recvBuff_tmp[16384];
char cvarname_tmp[64][64];
char cvarvalue_tmp[64][64];
char lasttoken[256];
int i=0, cvar_index=0;
strcpy(recvBuff_tmp, recvBuff);
pch=strstr(recvBuff_tmp, "\\");
strcpy(recvBuff_tmp, pch+1);
pch=strchr(recvBuff_tmp, 10);
if(pch){
*pch = 0;
}
pch = strtok(recvBuff_tmp,"\\");
while (pch != NULL){
if(strlen(pch) >= 64){
*(pch + 63) = 0; //Endkennung falls zu lang
}
if (!strcmp (lasttoken, "sv_hostname")){
strcpy (serverinfo[server_id].servername, pch);
}else if (!strcmp (lasttoken, "mapname")){
strcpy (serverinfo[server_id].mapname, pch);
}else if (!strcmp (lasttoken, "gamename")){
strcpy (serverinfo[server_id].modname, pch);
}else if (!strcmp (lasttoken, "sv_keywords")){
strcpy (serverinfo[server_id].keywords, pch);
}else if (!strcmp (lasttoken, "sv_maxclients")){
serverinfo[server_id].max_clients = atoi(pch);
}else if (!strcmp (lasttoken, "protocol")){
serverinfo[server_id].protocol = atoi(pch);
}else if (!strcmp (lasttoken, "g_needpass")){
serverinfo[server_id].need_password = atoi(pch);
}else if (!strcmp (lasttoken, "sv_punkbuster")){
serverinfo[server_id].punkbuster = atoi(pch);
}
if(i == 0){
i++;
}else{
// strcpy (serverinfo[server_id].cvars[cvar_index].name, lasttoken); //damit läuft der Code
// strcpy (serverinfo[server_id].cvars[cvar_index].value, pch); //damit läuft der Code
strcpy (cvarname_tmp[cvar_index], lasttoken);
strcpy (cvarvalue_tmp[cvar_index], pch);
cvar_index++;
i = 0;
}
strcpy(lasttoken, pch);
pch = strtok(NULL, "\\");
}
serverinfo[server_id].num_of_cvars = cvar_index;
//---------------------------------------------------------------------------------- ohne diesen Teil geht's wenn ich den Code komplett auf Char Arrays ausrichte
for(i = 0; i < MAX_CVARS; i++){
if(serverinfo[server_id].cvars[i].name){
free(serverinfo[server_id].cvars[i].name);
}
if(serverinfo[server_id].cvars[i].value){
free(serverinfo[server_id].cvars[i].value);
}
}
for(i = 0; i < serverinfo[server_id].num_of_cvars; i++){
if(serverinfo[server_id].cvars[i].name = malloc(strlen(cvarname_tmp[i])+1)){
strcpy(serverinfo[server_id].cvars[i].name, cvarname_tmp[i]);
}
if(serverinfo[server_id].cvars[i].value = malloc(strlen(cvarvalue_tmp[i])+1)){
strcpy(serverinfo[server_id].cvars[i].value, cvarvalue_tmp[i]);
}
}
}
Ganz schön viel Code.