Socket , c et irc

Résolu/Fermé
OJ - 9 oct. 2005 à 16:57
 LocknessSuisse - 29 mai 2009 à 11:59
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.

$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.

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 réponses

crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 506
9 oct. 2005 à 18:54
Bonjour,
Commence par lire la RFC de l'IRC
http://abcdrfc.free.fr/rfc-vf/rfc1459.html
elle explique en détail les échanges à mener.
A+, crabs
0
Salut.


Néanmoins je ne pense pas que le problème vient de la. Car j'ai deja lu la rfc irc. C'est dailleur grace a celle-ci que j'ai reussi a me connecter au serveur avec telnet.
Si tu penses a un chapitre en particulier de la rfc que j'aurai mal compris, indique le moi stp.

Merci de ta reponse.
0
crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 506
10 oct. 2005 à 15:10
Salut,
Il me semble qu'il faut faire des IO asynchrones d'une taille max de 512o et
qu'il fallait commencer par PASS, puis NICK et enfin USER (4.1 de la RFC)
Or ta connexion commence par USER puis NICK, je pas vu de PASS.

Autre truc, ton exemple telnet ne reprend pas les même identifiants que ton
source.

Sinon il semblerait qu'il y ait de nouvelles RFC pour IRC : 2810 à 2813 (pas
regardé en détail).

[j'avais participé à codage de client IRC y a 5 ans pour Solaris, je remets pas la
main sur les source :-( ]

J'ai pas vu sur le NET de différences entre les socket INET OpenBSD et
celles mis en oeuvre par les autres UNIX, donc je pense que c'est plutôt le
serveur qui attend quelque chose avant de répondre.

A+, crabs
0
OJ > crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008
11 oct. 2005 à 00:26
Salut.

Je crois que la commande pass est necessaire juste pour les serveurs necessitant un mot de passe.

Mais j'ai trouvé une solution, et je crois que c'était une bete erreur de ma part.
J'ai fais une fonction qui lit caractère par caractère sur le socket, et qui attend le \r\n de la fin de ligne irc.

Avec un select, j'attend un nombre variable de ligne (dépendant du serveur). Et donc c'est bien parti.

Merci pour ton aide et les infos
A bientot
0
LocknessSuisse
29 mai 2009 à 11:59
Et le tutoriel sur les winsock2, ça peux être utile : http://h2fr.free.fr/index.php?show_topic=263
0