[C] bot irc - Creepy_p0ney - 24-09-2012
voilà comme certains auront pu le remarquer sur l'irc, j'ai créer un bot, mais il a un certain bug c'est qu'il affiche plusieurs fois la même chose (le dernier message qu'il a envoyé). Mais je pense savoir pourquoi, mais je sais pas comment y remedier voici mon code : Code : #include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/wait.h>
int main(){
int sockfd;
struct sockaddr_in addr;
char pseudo[100]="NICK botfireWave\r\n";
char channel[100]="JOIN #bot\r\n";
char user[100]="USER botfireWave botfireWave botfireWave :bot c\r\n";
char buf[256];
char question[256]="https://www.google.fr/search?q=";
char question2[256];
char papa[100]="c'est qui papa";
char *suiteChaine;
int i=0;
printf("%s\n%s\n",pseudo,channel);
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){
perror("socket");
exit(1);
}
addr.sin_family=AF_INET;
addr.sin_port=htons(6667);
addr.sin_addr.s_addr = inet_addr("88.191.137.197");
if(connect(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr))<0){
perror("connect");
exit(1);
}
printf("connect");
send(sockfd,pseudo,strlen(pseudo),0);
recv(sockfd,buf,256,0);
printf("%s",buf);
printf("envoi nick");
send(sockfd,user,strlen(user),0);
recv(sockfd,buf,256,0);
printf("%s",buf);
printf("envoi usr");
send(sockfd,channel,strlen(channel),0);
recv(sockfd,buf,256,0);
printf("%s",buf);
printf("envoi chan");
send(sockfd,"PRIVMSG #bot :je suis de retour pour vous jouer un mauvais tour\r\n",strlen("PRIVMSG #bot :je suis de retour pour vous jouer un mauvais tour\r\n"),0);
while(1){
recv(sockfd,buf,256,0);
if(strstr(buf,"PING")!=NULL){
send(sockfd,"PONG\r\n",strlen("PONG\r\n"),0);
}
if((strstr(buf,"PRIVMSG")!=NULL)&&(strstr(buf,"comment vas tu ")!=NULL)){
send(sockfd,"PRIVMSG #bot :je me porte bien merci\r\n",strlen("PRIVMSG #bot :je me porte bien merci\r\n"),0);
}
if((strstr(buf,"PRIVMSG")!=NULL)&&(strstr(buf,papa)!=NULL)){
send(sockfd,"PRIVMSG #bot :c'est fireWave yeahhh \r\n",strlen("PRIVMSG #bot :c'est fireWave yeahhh \r\n"),0);
}
if((strstr(buf,"PRIVMSG")!=NULL)&&(strstr(buf,"bonjour tous")!=NULL)){
send(sockfd,"PRIVMSG #bot :ces sites son interdits monsieur !!!!\r\n",strlen("PRIVMSG #bot :ces sites son interdits monsieur !!!!\r\n"),0);
}
if((strstr(buf,"PRIVMSG")!=NULL)&&(strstr(buf,"parle moi de ton createur")!=NULL)){
send(sockfd,"PRIVMSG #bot : bientôt 15ans seconde générale\r\n",strlen("PRIVMSG #bot :bientôt 15ans seconde générale \r\n"),0);
}
if((strstr(buf,"PRIVMSG")!=NULL)&&(strstr(buf,"horgh_")!=NULL)){
send(sockfd,"PRIVMSG #bot :attention aux liens de horgh_ âme sensible s'abstenir\r\n",strlen("PRIVMSG #bot :attention aux liens de horgh_ âme sensible s'abstenir\r\n"),0);
}
if((strstr(buf,"PRIVMSG")!=NULL)&&(strstr(buf,"hommeparfait")!=NULL)){
send(sockfd,"PRIVMSG #bot :pfff op il veut me kick c'est pas bien !!!!\r\n",strlen("PRIVMSG #bot :pfff op il veut me kick c'est pas bien !!!!\r\n"),0);
}
if((strstr(buf,"PRIVMSG")!=NULL)&&(strstr(buf,"tu suces ?")!=NULL)){
send(sockfd,"PRIVMSG #bot :non et toi ?\r\n",strlen("PRIVMSG #bot :non et toi ?\r\n"),0);
}
if((strstr(buf,"PRIVMSG")!=NULL)&&(strstr(buf,"Supersnail")!=NULL)){
send(sockfd,"PRIVMSG #bot :il est op, mais je ne vais pas troll j'le suce bien\r\n",strlen("PRIVMSG #bot :il est op, mais je ne vais pas troll j'le suce bien\r\n"),0);
}
printf("%s",buf);
}
close(sockfd);
mon probleme je pense est sur cette ligne ci (il a encore le precedent message je pense) Code : recv(sockfd,buf,256,0);
merci d'avance
RE: [c bot] probleme bot en c - ark - 24-09-2012
Hum, j'aurais tendance a essayer d’écrire un \0 au tout début du buffer après l'avoir print, mais pas sur que ça marche.
RE: [c bot] probleme bot en c - b0fh - 24-09-2012
Hello,
Le problème est probablement que recv(2) travaille sur des données arbitraires et ne rajoute donc pas le terminateur nul à la fin d'une ligne. Quand un message plus court que le précédent est reçu, il est réécrit par dessus, et strstr ne voit pas la limite entre les deux.
Code : read_bytes = recv(sockfd, buf, 255, 0);
//check for error
buf[read_bytes] = '\0';
Note le 255 pour éviter une erreur off-by-one.
Ce code n'est pas fiable parce qu'il n'y a aucune garantie qu'une ligne entière soit disponible après un appel à recv(2), meme si ça sera le cas quasiment tout le temps. Pour faire proprement tu devrais avoir une première boucle qui accumule les résultats des appels à recv dans un buffer intermédiaire, cherche les terminateurs \n et déclenche une action le cas échéant, et copie le reste du buffer éventuel au début.
Ton implémentation de PING/PONG est incomplète, le PONG est sensé retourner l'argument envoyé avec PING. Le serveur serait en droit de te déconnecter pour ça.
Dernièrement, pour tes chaines de caractère constantes,
Code : char blah[100] = "foobarbaz";
A l'intérieur d'une fonction, cause l'allocation du buffer sur la stack et une initialisation des données en dur dans le code de la fonction, alors que
Code : char blah[] = "foobarbaz";
a au moins l'avantage d'utiliser un buffer exactement de la bonne taille, et que
Code : char *blah = "foobarbaz";
place la chaine dans la section de données, et ne génère pas de code d'initialiastion.
|