Hallo,
ich habe mal angefangen einen IRC Bot zu schreiben.
Dieser stürtzt leider manchmal ab wenn mehrere Bot's online sind.
Der Bot arbeitet mit Threads...
Wie schaffen den stable Bots das die nicht bei 1k Bots schon abstürzen?
Druckbare Version
Hallo,
ich habe mal angefangen einen IRC Bot zu schreiben.
Dieser stürtzt leider manchmal ab wenn mehrere Bot's online sind.
Der Bot arbeitet mit Threads...
Wie schaffen den stable Bots das die nicht bei 1k Bots schon abstürzen?
Schwer zu sagen, zeig doch mal den Code, mit dem zu die Threads verwaltest...
Hast du evtl. nicht alle globalen Zugriffe korrekt abgesichert/synchonisiert mit z.B. CriticalSections o.Ä.?
Arbeite mit _beginthreadex()
So ungefähr sieht des aus:
Grob gesehen sieht das ganze jetzt so aus.Code:int irc_start() {
reserviere speicher für buffer
empfange bytes vom server und schreibe in buffer
starte "derThread" mit beginthreadex() und übergebe buffer
}
int derThread(char *wert) {
kopiere Wert von der Variablen "wert"
gebe buffer("wert") mit free() frei
}
Kann den Code leider nicht komplett posten.
Du startest also aus einem Programm heraus mehrere Bots, oder wofür verwendest du Multithreading?
Ich verwende Multithreading für die erhaltenen Befehle.
Rede von dem kompletten Botnet.Zitat:
Du startest also aus einem Programm heraus mehrere Bots
Wann genau stürzt er ab, wenn du das Programm x mal bei dir selbst startest oder auf verschiedenen Rechnern, evtl. liegt es auch am IRC Server?
Gibt es bestimmte Meldungen?
Also habe schon ein paar Victims mit dem Bot...
Wenn ich z.B denn login Befehl gebe:
Erhalte ich von den Bots die Ausgabe:Code:.login pw
Und danach stürzen einige Bots immer ab.Zitat:
Successful logged in
Am Server liegt es 100% nicht
Schonmal mit OllyDbg versucht?
Oder einfach ein paar Debug-Ausgaben einfügen und schauen wo das Ding abstürzt.
Aber mal ehrlich: wenn du keinen Code rausgibst verstehe ich nicht, wieso dieser Thread überhaupt hier steht.
Irgendwo in diesem Code muss ein Fehler sein...Code:for(;;) {
err = 0;
// WaitForSingleObject((HANDLE)x,300); //test
if(b == NULL) {
memset(puffer,0,sizeof(puffer));
CloseHandle((HANDLE)x);
}
else {
while(1)
if(b == NULL)
break;
CloseHandle((HANDLE)x);
memset(puffer,0,sizeof(puffer));
}
err = recv(socket,puffer,MAX-1,0);
if((err == 0) || (err == SOCKET_ERROR)) {
//printf("WSAGetLastError: %i\n",WSAGetLastError());
shutdown(socket,2);
closesocket(socket);
WSACleanup();
return 1;
}
else {
puffer[err] = '\0';
b = calloc(strlen(puffer)+1,sizeof(char));
if(b != NULL) {
strncpy(b,puffer,strlen(puffer));
cmd.msg = &b;
x = _beginthreadex(NULL,0,split_cmd,&cmd,0,NULL);
}
}
//split_cmd()
unsigned __stdcall split_cmd(irc *cmd) {
char *p,user[24],*buf;
argv parameters;
int err,socket;
memset(¶meters,0,sizeof(argv));
buf = calloc(strlen(*cmd->msg)+1,sizeof(char));
if(buf == NULL)
return 1;
else
memset(buf,0,sizeof(buf));
strncpy(buf,*cmd->msg,strlen(*cmd->msg));
free(*cmd->msg);
*cmd->msg = NULL;
Bei Victims sehe ich die Ausgaben nicht...Zitat:
der einfach ein paar Debug-Ausgaben einfügen und schauen wo das Ding abstürzt.
Lass die Ausgaben im Chat(query) erscheinen.