Mit Sockets ins IRC senden... (Linux)
-
Ich habe mir einen kleinen Bot in C geschrieben (Linux, gcc), der insofern funktioniert, dass er connected und meinem Channel joined. Will ich allerdings danach etwas ins IRC senden, kommt nur korruptes Material am Server an. Und zwar habe ich eine check()-Funktion, die den Inhalt der zurückgesendeten Informationen verarbeiten soll. Diese Funktion sieht wie folgt aus:
int check(char *buffer, int sock) { char *msg; if ((msg = strstr(buffer, "PING"))) { char *replace; if (replace = strchr(msg, 'I')) *replace = 'O'; send(sock, msg, strlen(msg), 0); } else if ((msg = strstr(buffer, "376"))) { char cmdJoin[] = "JOIN #rax\n"; send(sock, cmdJoin, sizeof(cmdJoin), 0); } else if ((msg = strstr(buffer, ":!cmd"))) { char input[1024]; printf("Befehl bitte:\n> "); fgets(input, sizeof(input), stdin); printf("Sending: %s", input); send(sock, input, sizeof(input), 0); } return 0; }
'buffer' wird von 'recv' "geladen", 'sock' ist der Socket. Die erste und die zweite Abfrage funktionieren, sprich er sendet ein entsprechendes PONG auf ein PING zurück und joined dem Channel, nachdem die MOTD (RAW 376) zuende ist. Die dritte Abfrage hatte ich anfangs wie die Zweite, nun, nachdem er nicht auf meine Anweisungen reagiert hat, habe ich diese Abfrage eingebaut, sodass ich die Befehle direkt testen kann.
Führe ich nun im IRC '!cmd' aus, so erscheint folgendes auf der Konsole:
:zony!zony@hybridZ.net PRIVMSG #rax :!cmd Befehl bitte: > PRIVMSG #rax :Hallo Sending: PRIVMSG #rax :Hallo :biology.de.eu.hybridZ.net 421 raxBOT BÐ :Unknown command :biology.de.eu.hybridZ.net 421 raxBOT BBXñÿ¿$üB :Unknown command :biology.de.eu.hybridZ.net 421 raxBOT B :Unknown command :biology.de.eu.hybridZ.net 421 raxBOT BBÆãB :Unknown command :biology.de.eu.hybridZ.net 421 raxBOT B :Unknown command :biology.de.eu.hybridZ.net 421 raxBOT Bœ :Unknown command
Es sieht irgendwie danach aus, als ob der Socket nur Unsinn sendet, und nicht das, was er senden soll. Woran kann das liegen?
Danke schonmal.
zony
-
zony schrieb:
send(sock, input, sizeof(input), 0);
strlen statt sizeof
-
Vielleicht besser strlen + 1, damit das 0-Terminierungszeichen noch mit uebertragen wird
mfg
v R
-
Nein, das wär wieder falsch. IRC-Nachrichten werden durch CR-LF abgetrennt, d.h. die 0 wär das erste Zeichen der nachfolgenden Nachricht -> Parse Error auf Serverseite.
-
Stimmt, cr-lf wuerde ja gar nicht mehr ausgewertet werden, da string ja schon zuende
Daran hab ich gar nicht gedacht, sry.
mfg
v R
-
Und woran liegts nun?
zony
-
Lies doch erstmal die Antworten. Alle. Jedenfalls die erste.
-
Habe ich, nur daran liegts nicht (was mich auch schwer wundern würde, da der Rest ja komischerweise auch funktioniert). Wenn ich 'sizeof()' in 'strlen()' wandle, sieht das Ergebnis auf der Konsole wie folgt aus:
:zony!zony@hybridZ.net PRIVMSG #rax :!cmd Befehl bitte: > PRIVMSG #rax :Hallo Sending: PRIVMSG #rax :Hallo
Danach kommt nichts mehr.
zony
-
Was soll da auch kommen, wenn der Server dir nix schickt ... hast du den RFC 2812: Internet Relay Chat: Client Protocol gelesen?
-
Was soll da auch kommen, wenn der Server dir nix schickt
Das nicht, aber ich sollte die abgesendete Nachricht doch im Channel sehen können, oder? :p
hast du den RFC 2812: Internet Relay Chat: Client Protocol gelesen?
Nein, werde sie mir aber mal zu Gemüte führen, danke. Wenn jemandem noch was einfällt, bitte posten.
zony
-
zony schrieb:
Das nicht, aber ich sollte die abgesendete Nachricht doch im Channel sehen können, oder? :p
Nö, das wird nicht zurückgeschickt.
:p
-
Nö, das wird nicht zurückgeschickt.
Wie soll ich das verstehen? Wenn ich mit einem normalen Client im selben Channel bin, sollte ich die Message doch sehen, wenn sie der Bot wirklich senden würde. Das ist aber nicht der Fall.
Ich habe mir die RFC angesehen, aber dort steht auch nichts Neues für mich drin.
zony