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

Réseau C Discussion :

[Debutant]Socket irc et communication bi-directionnelle


Sujet :

Réseau C

  1. #1
    Ojy
    Ojy est déconnecté
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 3
    Points : 4
    Points
    4
    Par défaut [Debutant]Socket irc et communication bi-directionnelle
    Salut a tous.

    Je voulais faire un petit bot d'administration pour un chan sur irc, car tous ce que je trouve ne compile pas bien sur obsd. Et puis ca me fera peut etre comprendre le principe du socket.

    Donc j'ai reussi en regardant par ci par la a ouvrir un socket, vers le serveur irc.

    Mais je crois que ma methode n'est pas bonne lors de la communication avec le serveur.

    En gros j'ai essayé avec un telnet et j'ai reussi a avoir une connexion, et meme a me mettre sur un chan.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $telnet x.x.x.x 6667
    (2 ligne de blabla du serveur)
    USER OJ . . :monnom
    NICK LULU
    (le serveur renvoi :
    PING :xxxxxxx
    ou xxxxx est un chiffre a lui retourner)
    PONG xxxxxxx
    (a ce stade, je suis enregistrer et je peu faire:)
    JOIN #test
    PRIVMSG #test :Salut tt le monde

    Bref, ca c'est en telnet. Mais en C je ne comprend pas comment enchainer lecture et ecriture sur le socket.

    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
    int initsrv(int sock){
     
      char buffer[LG_BUFFER];
      int nb_lus;
      char *user="LuLu . . :OJ\r\n";
      char *nick="LuLuLeBot\r\n";  
     
     
      videsocket(sock);
     
      //videsocket(sock);
      if(write(sock,user,strlen(user))<0){
        perror("Erreur Enregistrement Usr\n");
        return(-1);
      }
      if(write(sock,nick,strlen(nick))<0){
        perror("Erreur Enregistrement Nick\n");
        return(-1);
      }
      if((nb_lus=read(sock,buffer,LG_BUFFER))<0){
        perror("Erreur Ping serveur\n");
        return(-1);
        }
      //printf("Reponse ping%s\n",buffer);
      write(STDOUT,buffer,LG_BUFFER);
      printf("\n");
      return(0);
    }
    La fonction videsocket(int socket) lit sur le socket 1024 caractère.

    Donc ca m'affiche les 2 lignes de blabla et puis plus rien, le programme bloque sur le dernier read de initserveur().

    Voila, voila. Jespere avoir été complet.
    Si quelqu'un a une idee, ou un bon tutorial...

    Merci davance a ceux qui prendront le tps de lire ca.
    A bientot

  2. #2
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Directeur
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 353
    Points : 130 321
    Points
    130 321
    Billets dans le blog
    1
    Par défaut
    Il ne faut pas lire 1024 caractères, sinon il va attendre réellement 1024 caractères... et si y'en a pas autant à lire, ça restera longtemps comme ça. Il faut lire jusqu'à tomber sur la marque de fin de ligne qui est le couple \r \n, comme avec Telnet.

    Voilà ma fonction (un peu modifiée) pour lire une ligne... Faut prévoir un tampon de réception suffisamment grand pour qu'il puisse lire une ligne entière (et retire le \r\n final).

    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
    int recevoir(int irc, char* reception, int taille)
    {
      int i = 0, nb_lus;
     
      do {
        if (i == taille) {
          fprintf(stderr, "Message reçu trop grand.\n");
          return 0;
        }
     
        nb_lus = recv(irc, reception + i, 1, 0);
     
        if (nb_lus == -1) {
          perror("recv");
     
          return 0;
        }
     
      } while (reception[i++] != '\n');
     
      reception[i-2] = '\0';
     
      return 1;
    }
    Mais s'il n'y a rien à lire, il attendra. Dans ce cas, tu devras utiliser select() pour vérifier s'il y a des données à lire.

  3. #3
    Ojy
    Ojy est déconnecté
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    Salut.

    J'ai enfin trouvé. Je ne suis pas sur que le fait de lire 1024 caractère pose un problème, car la fonction read(sock,buffer,1024) retournait, meme si le buffer ne contenait pas la totalité des caractère.
    Mais j'ai quand meme pris ta fonction, qui traite bien le message (notamment la suppression des terminateurs de ligne).
    Le problème venait d'un bete oublie dans la chaine envoyé au serveur. J'oubliai de mettre NICK et USER devant mes chaines. Quel ane.

    J'ai utilisé un select() pour lire un nombre variable de lignes.
    Ca avance en tout cas.

    Merci pour ces infos.

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

Discussions similaires

  1. Protocole communication bi-directionnelle pour port parallèle
    Par vr_brandon dans le forum Automation
    Réponses: 2
    Dernier message: 03/06/2008, 10h47
  2. [Debutant] Sockets: le schéma est-il vrai ou faux?
    Par fantomasmusic dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 14/07/2007, 14h50
  3. Socket - Problème de communication client/serveur
    Par Arkinou dans le forum Réseau
    Réponses: 4
    Dernier message: 31/05/2007, 16h01
  4. Réponses: 8
    Dernier message: 18/04/2007, 15h26
  5. [Debutant][Socket]mise en boucle
    Par Vader_666 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 31/05/2005, 11h28

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