IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Algorithme IRC


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Algorithme IRC
    Bonjour, je code un bot IRC, du coups j'ai besoin de créer un algorithme qui récupère le pseudo et le texte pour chaque méssage envoyé sur le canal IRC que mon bot gère.
    J'ai donc codé les fonctions suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    int gerer_recv(char* buff) {
    int i=1, limite = 0;
    char nick[50] = "";
    char *txt = NULL;
    txt = strstr(buff, "PRIVMSG");   
     
    if(txt == NULL) {                     // Si la chaine n'est pas un PRIVMSG on ne la traite pas
       printf("%s", buff);
       return 0;
    }
    while(buff[i] != '!' && i < 50) {  // La condition i<50 pour savoir si c'est un véritable 
    nick[i-1] = buff[i];                       // message a traiter car pseudo < 50 caractères de longs
    i++;
    }
    if(i==49)  {
    printf("%s", buff);                              
       return 0;
    }
    txt = strstr(txt, ":");
    printf("%s : %s", nick, txt+1); // On affiche la chaine située 1 caractère après le ':'
    }
     
    void* recv_line(void* data) {
    int i = 0, t_buff;
    char buff[512] = "";
    SOCKET serv = (SOCKET)data;
    t_buff = recv(serv, buff, 512, 0);
    gerer_recv(buff);
    }
    La fonction recv_line est dans un thread dans une boucle infinie dans mon main(), mais j'ai du mal avec mon algo car malgrès que je vérifie que les chaines traités contiennent des PRIVMSG, donc que au début de celle ci on a le pseudo de la source du méssage placé avant un '!' j'ai des chaines qui passent cette condition mais qui n'on pas de '!', d'ou ma condition i<50 sinon nick dépasse car la condition n'est jamais remplie.

    Et enfin, et surtout, mon programme fait chauffer mon ordi, je l'entend très vite, c'est le fait qu'il y ai un thread dans un while(1) ou car mon algo est mal fait ?

    Merci
    Dernière modification par Invité ; 01/05/2011 à 22h12.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Petit up, et GROS EDIT : maintenant mon soucis vien de l'algo en lui meme si quelqu'un avait une idée... Pour irc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
        #include <unistd.h>
        #include <pthread.h>
     
        typedef int SOCKET;
        typedef struct sockaddr_in SOCKADDR_IN;
        typedef struct sockaddr SOCKADDR;
        #include "irc.h"
        #define INVALID_SOCKET -1
        #define SOCKET_ERROR -1
        #define closesocket(s) close(s)
        #define PORT 80
     
    int main(int argc, char *argv[])
    {
        struct timeval temps;
        temps.tv_sec = 0;
        temps.tv_usec = 100;
        int err;
        SOCKET serv = socket(AF_INET, SOCK_STREAM, 0);
        SOCKADDR_IN cserv;
        struct irc_msg ircmsg;
        ircmsg.serv = serv;
        ircmsg.nick = malloc(50 * sizeof(char));
        ircmsg.text = malloc(500 * sizeof(char));
        ircmsg.chaine = malloc(512 * sizeof(char));
        ircmsg.online = 0;
        pthread_t recevoir;
        struct hostent *adresse;
        fd_set read;
     
        if(argc == 1) {
                printf("Veuillez renseigner une adresse\n");
                    return 0;
        }
        adresse = gethostbyname(argv[1]);
        cserv.sin_addr = *((struct in_addr *)(adresse->h_addr));
        cserv.sin_family = AF_INET;
        cserv.sin_port = htons(6667);
        err = connect(serv, (SOCKADDR*)&cserv, sizeof(cserv));
     
        printf("Connexion a %s\n", inet_ntoa(cserv.sin_addr));
        if(err == -1) {
                printf("Err connection\n");
                    return 0;
        }
        printf("Connécté au serveur %s\n", argv[1]);
        send_line(serv, "NICK Bot-fox \r\n\r\n");
        send_line(serv, "PRIVMSG nickserv identify ganjaman\r\n\r\n");
        send_line(serv, "USER a a a a \r\n\r\n");      // A remplir correctement meme si le serveur s'en charge généralement
        send_line(serv, "JOIN #romfox\r\n\r\n");
     
        while(1) {
            pthread_create(&recevoir, NULL, recv_line, (void *)&ircmsg);
            FD_ZERO(&read);
            FD_SET(STDIN_FILENO, &read);
            select(STDIN_FILENO+1, &read,NULL,NULL,&temps);
            if(FD_ISSET(STDIN_FILENO, &read)) {
                    free(ircmsg.nick);
                        free(ircmsg.text);
                            free(ircmsg.chaine);
                                closesocket(serv);
                                return 0;
            }
            pthread_join(recevoir, NULL);
     
        }
        return 0;
     
     
    }
    irc.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    struct irc_msg {
        SOCKET serv;
        char *nick;
        char *event;
        char *text;
        char *chaine;
        int online;
    };
     
    void send_line(SOCKET Client, char* buffer) {
        int i = 0;
     
        while(i< strlen(buffer)) {
               send(Client, (char *)&buffer[i], 1, 0);
               i++;
        }
    }
     
    int range(struct irc_msg *ircmsg) {
     
        char *txt = NULL;
        int i = 1;
        if(ircmsg->online == 0) {
            txt = strstr(ircmsg->chaine, "JOIN");
                if(txt != NULL) {
                        ircmsg->online = 1;
                                printf("NOW ONLINE %s\n", ircmsg->chaine);
                                        return 0;
                 }
     
        } // End if
            txt = strstr(ircmsg->chaine, "PRIVMSG");
                 if(txt != NULL) {
                     while(ircmsg->chaine[i] != '!') {
                         ircmsg->nick[i-1] = ircmsg->chaine[i];
     
                     }
                     txt = strstr(ircmsg->chaine+1, ":");
                          ircmsg->text = txt+1;
                               printf("%s : %s\n",ircmsg->nick,ircmsg->text);
     
                }  // End PRIVMSG
                printf("%s\n", ircmsg->chaine);
    }
     
    int fonctions(struct irc_msg *ircmsg) {
     
        return 0;
     
    }
     
    void* recv_line(void* data) {
        int i = 0, t_buff;
        struct irc_msg *irc_mss = (struct irc_msg *)data;
        t_buff = recv(irc_mss->serv, irc_mss->chaine, 512, 0);
        irc_mss->chaine[t_buff] = '\0';
        range(irc_mss);
    }
    Dernière modification par Invité ; 01/05/2011 à 21h42.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par romfox17 Voir le message
    Petit up, et GROS EDIT : maintenant mon soucis vien de l'algo en lui meme si quelqu'un avait une idée... Pour irc, en fait je recherche une idée pour bien traiter mes chaine recues.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
        #include <unistd.h>
        #include <pthread.h>
     
        typedef int SOCKET;
        typedef struct sockaddr_in SOCKADDR_IN;
        typedef struct sockaddr SOCKADDR;
        #include "irc.h"
        #define INVALID_SOCKET -1
        #define SOCKET_ERROR -1
        #define closesocket(s) close(s)
        #define PORT 80
     
    int main(int argc, char *argv[])
    {
        struct timeval temps;
        temps.tv_sec = 0;
        temps.tv_usec = 100;
        int err;
        SOCKET serv = socket(AF_INET, SOCK_STREAM, 0);
        SOCKADDR_IN cserv;
        struct irc_msg ircmsg;
        ircmsg.serv = serv;
        ircmsg.nick = malloc(50 * sizeof(char));
        ircmsg.text = malloc(500 * sizeof(char));
        ircmsg.chaine = malloc(512 * sizeof(char));
        ircmsg.online = 0;
        pthread_t recevoir;
        struct hostent *adresse;
        fd_set read;
     
        if(argc == 1) {
                printf("Veuillez renseigner une adresse\n");
                    return 0;
        }
        adresse = gethostbyname(argv[1]);
        cserv.sin_addr = *((struct in_addr *)(adresse->h_addr));
        cserv.sin_family = AF_INET;
        cserv.sin_port = htons(6667);
        err = connect(serv, (SOCKADDR*)&cserv, sizeof(cserv));
     
        printf("Connexion a %s\n", inet_ntoa(cserv.sin_addr));
        if(err == -1) {
                printf("Err connection\n");
                    return 0;
        }
        printf("Connécté au serveur %s\n", argv[1]);
        send_line(serv, "NICK Bot-fox \r\n\r\n");
        send_line(serv, "PRIVMSG nickserv identify motdepasse\r\n\r\n");
        send_line(serv, "USER a a a a \r\n\r\n");      // A remplir correctement meme si le serveur s'en charge généralement
        send_line(serv, "JOIN #romfox\r\n\r\n");
     
        while(1) {
            pthread_create(&recevoir, NULL, recv_line, (void *)&ircmsg);
            FD_ZERO(&read);
            FD_SET(STDIN_FILENO, &read);
            select(STDIN_FILENO+1, &read,NULL,NULL,&temps);
            if(FD_ISSET(STDIN_FILENO, &read)) {
                    free(ircmsg.nick);
                        free(ircmsg.text);
                            free(ircmsg.chaine);
                                closesocket(serv);
                                return 0;
            }
            pthread_join(recevoir, NULL);
     
        }
        return 0;
     
     
    }
    irc.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    struct irc_msg {
        SOCKET serv;
        char *nick;
        char *event;
        char *text;
        char *chaine;
        int online;
    };
     
    void send_line(SOCKET Client, char* buffer) {
        int i = 0;
     
        while(i< strlen(buffer)) {
               send(Client, (char *)&buffer[i], 1, 0);
               i++;
        }
    }
     
    int range(struct irc_msg *ircmsg) {
     
        char *txt = NULL;
        int i = 1;
        if(ircmsg->online == 0) {
            txt = strstr(ircmsg->chaine, "JOIN");
                if(txt != NULL) {
                        ircmsg->online = 1;
                                printf("NOW ONLINE %s\n", ircmsg->chaine);
                                        return 0;
                 }
     
        } // End if
            txt = strstr(ircmsg->chaine, "PRIVMSG");
                 if(txt != NULL) {
                     while(ircmsg->chaine[i] != '!') {
                         ircmsg->nick[i-1] = ircmsg->chaine[i];
     
                     }
                     txt = strstr(ircmsg->chaine+1, ":");
                          ircmsg->text = txt+1;
                               printf("%s : %s\n",ircmsg->nick,ircmsg->text);
     
                }  // End PRIVMSG
                printf("%s\n", ircmsg->chaine);
    }
     
    int fonctions(struct irc_msg *ircmsg) {
     
        return 0;
     
    }
     
    void* recv_line(void* data) {
        int i = 0, t_buff;
        struct irc_msg *irc_mss = (struct irc_msg *)data;
        t_buff = recv(irc_mss->serv, irc_mss->chaine, 512, 0);
        irc_mss->chaine[t_buff] = '\0';
        range(irc_mss);
    }
    Dernière modification par Invité ; 01/05/2011 à 23h12.

  4. #4
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonsoir,

    Peut-être trouveras tu un compléments d'informations ici.

  5. #5
    Invité
    Invité(e)
    Par défaut
    En fait je parlais pas du programme, comme tu vois j'utilise déja les sockets, mais plutot de l'algo a utiliser pour traiter les chaines ?

  6. #6
    Invité
    Invité(e)
    Par défaut
    J'ai un code minimum sans algorithme, c'est plus lisible et si quelqu'un pouvait me donner des idées pour extraire le pseudo et le texte déja, vu la syntaxe de IRC.

    main.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
        #include <unistd.h>
        #include <pthread.h>
     
        typedef int SOCKET;
        typedef struct sockaddr_in SOCKADDR_IN;
        typedef struct sockaddr SOCKADDR;
        #include "irc.h"
        #define INVALID_SOCKET -1
        #define SOCKET_ERROR -1
        #define closesocket(s) close(s)
        #define PORT 80
     
    int main(int argc, char *argv[])
    {
        struct timeval temps;
        temps.tv_sec = 0;
        temps.tv_usec = 100;
        int err;
        SOCKET serv = socket(AF_INET, SOCK_STREAM, 0);
        SOCKADDR_IN cserv;
        struct irc_msg ircmsg;
        ircmsg.serv = serv;
        ircmsg.nick = malloc(50 * sizeof(char));
        ircmsg.text = malloc(500 * sizeof(char));
        ircmsg.chaine = malloc(512 * sizeof(char));
        ircmsg.online = 0;
        pthread_t recevoir;
        struct hostent *adresse;
        fd_set read;
     
        if(argc == 1) {
                printf("Veuillez renseigner une adresse\n");
                    free(ircmsg.nick);
                        free(ircmsg.text);
                            free(ircmsg.chaine);
                    return 0;
        }
        adresse = gethostbyname(argv[1]);
        cserv.sin_addr = *((struct in_addr *)(adresse->h_addr));
        cserv.sin_family = AF_INET;
        cserv.sin_port = htons(6667);
        err = connect(serv, (SOCKADDR*)&cserv, sizeof(cserv));
     
        printf("Connexion a %s\n", inet_ntoa(cserv.sin_addr));
        if(err == -1) {
                printf("Err connection\n");
                    return 0;
        }
        printf("Connécté au serveur %s\n", argv[1]);
        send_line(serv, "NICK Bot-fox \r\n\r\n");
        send_line(serv, "PRIVMSG nickserv identify motdepasse\r\n\r\n");
        send_line(serv, "USER a a a a \r\n\r\n");      // A remplir correctement meme si le serveur s'en charge généralement
        send_line(serv, "JOIN #romfox\r\n\r\n");
     
        while(1) {
            pthread_create(&recevoir, NULL, recv_line, (void *)&ircmsg);
            FD_ZERO(&read);
            FD_SET(STDIN_FILENO, &read);
            select(STDIN_FILENO+1, &read,NULL,NULL,&temps);
            if(FD_ISSET(STDIN_FILENO, &read)) {
                    free(ircmsg.nick);
                        free(ircmsg.text);
                            free(ircmsg.chaine);
                                closesocket(serv);
                                return 0;
            }
            pthread_join(recevoir, NULL);
     
        }
        return 0;
    }
    irc.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    struct irc_msg {
        SOCKET serv;
        char *nick;
        char *event;
        char *text;
        char *chaine;
        int online;
    };
     
    void send_line(SOCKET Client, char* buffer) {
        int i = 0;
     
        while(i< strlen(buffer)) {
               send(Client, (char *)&buffer[i], 1, 0);
               i++;
        }
    }
     
    int range(struct irc_msg *ircmsg) {
     
     
        printf("%s\n", ircmsg->chaine);
    }
     
    int fonctions(struct irc_msg *ircmsg) {
        char *txt = NULL;
        int t_buff = strlen(ircmsg->chaine);
     
        txt = strstr(ircmsg->chaine, "PING");
        if (txt != NULL && ircmsg->chaine[0] == 'P') {
        ircmsg->chaine[1] = 'O';
        printf("%s", ircmsg->chaine);
        send_line(ircmsg->serv, ircmsg->chaine);
        send_line(ircmsg->serv, "\r\n\r\n");
        return 0;
        }
     
     
        return 0;
     
    }
     
    void* recv_line(void* data) {
        int i = 0, t_buff;
        struct timeval temps;
        temps.tv_sec = 0;
        temps.tv_usec = 100;
        fd_set read;
        struct irc_msg *irc_mss = (struct irc_msg *)data;
        FD_ZERO(&read);
        FD_SET(irc_mss->serv, &read);
        select(irc_mss->serv+1, &read, NULL, NULL, &temps);
        if(FD_ISSET(irc_mss->serv, &read)) {
        t_buff = recv(irc_mss->serv, irc_mss->chaine, 512, 0);
        irc_mss->chaine[t_buff] = '\0';
        range(irc_mss);
        fonctions(irc_mss);
        }
    }
    Dernière modification par Invité ; 02/05/2011 à 20h10.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Formalisation graphique des algorithmes
    Par David R. dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 08/12/2012, 10h21
  2. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  4. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 12h09
  5. Algorithme génétique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/03/2002, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo