IRC-bot zu langsam!?
-
Da ist nicht C zu langsam, sondern die Interaktion übers Netz. Während dieser WHOIS-Geschichte kann C bzw. deine CPU ja nicht viel mehr tun, als auf Antwort zu warten, und eigentlich warten alle Sprachen gleich schnell
Du musst dich natürlich parallel auch ums PingPong kümmern.
-
wie soll man das den parallel machen? Geht eigendlich Multitasking in einer Dosanwendung?
Von meinem bissherigen wissen hab ich nur die moeglichkeit die anfragen aufzuteilen. Das ich vllt bei jedem pong nur ein channel einlese.
-
Kein Multitasking. Mich wundert ehrlich gesagt, wieso du so ein Problem damit hast, das sollte sich eigentlich von selbst ergeben, wie das funktioniert. Wie ist denn deine Hauptschleife aufgebaut?
BTW bezweifle ich, dass du eine DOS-Anwendung hast. Unter DOS ist es ein ziemlicher Akt, TCP/IP zum Laufen zu kriegen.
-
Geht eigendlich Multitasking in einer Dosanwendung?
Natürlich nicht.
Oder meinst du "Konsolen-Anwendung" statt Dos-Anwendung? Dann lautet die Antwort auf deine Frage: Ja.
-
Sry ich meinte Konsolen anwendung. Ich weiss das es erst seit windows 95 moeglich ist ;).
-
Hast du bedacht, dass der IRC-Server deinen Bot drosselt, wenn dieser zu viel/zu schnell sendet? Deiner Beschreibung nach offenbar nicht...
Es ist nämlich so, dass ein Client nur eine bestimmte Anzahl Anweisungen pro Sekunde (der genaue Algorithmus steht im RFC, hängt aber auch vom Server ab) absetzen darf. Wenn du nun 100 WHOIS-Anfragen auf einmal schickst, ist dein Bot effektiv lahmgelegt, bis alle diese Anfragen vom Server abgearbeitet wurden.
Weil diese Anfragen aber zu schnell hintereinander kamen, lässt sich der Server mit der Bearbeitung viel Zeit und dein Bot ist ziemlich lange lahmgelegt.
-
nein ich hab mein Bot noch nicht gedrosselt. Aber er sendet ja die 200 whois anweisungen nicht auf einmal. Er laed die zuerst in Datenbank und dann sendet er whois zu dem einzeilen user. Naja auch wenn ich das Whois komplett rausnehme ist er immernoch zu langsam alles einzutragen. Ich dachte eigendlich immer das das viel schneller gehen muesste. Er prueft erst ob es den namen gibt wenn ja updatet er ihn wenn nicht erstellt er ihn, naja und dafuer braucht er so eine halbe sekunde.
Wenn der in den Channel joint bekommt man ja eine namensliste die liest er ein und trennt die ganzen namen in eine array dann traegt er die ganzen namen in SQL Datenbank ein. Kann natuerlich auch sein das SQL datenbank zu langsam ist (die ist auch online).
Aja opropo drosseln. Ich wollte den sowieso drosseln damit der nicht wegen Flodden gekickt wird. Wieviel beitraege pro sekunde waerenden gut? bzw. wieviel zeit solte zwischen jedem senden gelassen werden?
So und ich werd mich jetzt erstmal ueber multitasking schlau machen.
-
XzenTorXz schrieb:
Wieviel beitraege pro sekunde waerenden gut? bzw. wieviel zeit solte zwischen jedem senden gelassen werden?
Wie gesagt, der genaue Algorithmus steht im RFC bzw. sollte sich leicht finden lassen.
Ich meine, im RFC steht, dass ein "einfacher" Client nur eine Zeile pro zwei Sekunden schicken soll. Das ist der einfachste Drosselalgorithmus.
-
cd9000 schrieb:
Ich meine, im RFC steht, dass ein "einfacher" Client nur eine Zeile pro zwei Sekunden schicken soll. Das ist der einfachste Drosselalgorithmus.
eine antwort in 2 sekunden? das ist ein bisschen arg langsam finde ich. Wo finde ich eigendlich die RFC?
-
K ich hab jetzt ueber multithreads informiert. Ich hab jetzt ein paar extrathreads die das mit dem mysql uebernehmen. Das problem ist aber das der irgendwie mit den sql abfragen durcheinander kommt und dann verliert er immer die connection von dem sql server verliert !?
Aja und kann ich irgendwie ueberpruefen ob der eine thread noch arbeitet, ohne auf ihn zu warten?EDIT: K ich hab das eigendlich problem gefunden und zwar das er die zeile falsch uebergibt ist irgendwie eine andere.
also:WORD WINAPI namelist(LPVOID data){ char line[MAXBUFFER], temp[MAXBUFFER], temp2[MAXBUFFER]; char sline[64][92]; strcpy(line, (char *)data); ... } void auswerten(char line[MAXBUFFER]){ ... if(strgleich(substr(aktion, 0, 3), "353")){ hThread[threadid] = CreateThread(NULL,0,namelist,(LPVOID)line,0,&dwThreadID[threadid]); //die zeile wird an den thread uebergeben ... } }Theoretich muesste er die line variable uebergeben und zwar nur die wo eine Namesliste kommt.
Wenn man aber die ausgabe anguckt. wird der thread viel speater gestartet. und ich glaube das er auch die line von viel spaeter nimmt. Hat jemand eine ahnung wie man das beheben kann?
-
XzenTorXz schrieb:
cd9000 schrieb:
Ich meine, im RFC steht, dass ein "einfacher" Client nur eine Zeile pro zwei Sekunden schicken soll. Das ist der einfachste Drosselalgorithmus.
eine antwort in 2 sekunden? das ist ein bisschen arg langsam finde ich. Wo finde ich eigendlich die RFC?
Du hast es geschafft ohne RFC einen IRC-Bot zu basteln, alle Achtung

Das RFC findest du zB hier: http://www.irchelp.org/irchelp/rfc/rfc.html
MfG SideWinder
-
heyho
bin auch grad dabei mir nen irc bot zu basteln. das ganze soll im quakenet stattfinden. nur hab ich auch das prob das mir mehrere zeilen auf einma geschickt werden und er dann beim parsen schwierigkeiten bekommt und manche sachen falsch interpretiert.
das parsen sieht wie folgt aus:string MyBot::getIRC() { char buff[512]; string temp; int f; memset(buff,0,sizeof(buff)); recv(sock,buff,512,0); temp = buff; f = (int)temp.find_last_of("\r\n"); temp.erase(f); return temp; }was könnte man daran ändern damit ich für den fall das mehrere zeilen auf einma geschickt werden das auch zeile für zeile abarbeiten kann?!
gruss