Ping de connection.

Discussion autour des servers IRCoderz et des services SCoderz

Message par Shmolt » Mar Avr 03, 2007 12:03 pm

Bonjour,

Je ne sais pas si je suis au bon endroit pour poster, excusez-moi si ce n'est pas le cas. Je suis en train de coder une espèce de client qui a l'air de "marcher", pour l'instant. Il y a juste un petit soucis au moment du ping de connection. Ca n'empêche pas la bête de "tourner", juste un peu embêtant :/

En connectant par telnet, je reçois un "PING :xxxxxxxxxx", auquel je réponds par un "PONG :xxxxxxxxxx". J'envois les paramètres USER et c'est bonard.

Maintenant, avec le "client", c'est différent. J'ai codé une fonction qui quote le ping, elle affiche/envoit ce qu'il faut, mais il faut tapper deux fois la commande USER.

if (!strncmp(bufferReception , "PING" , 4))
{
memset(pong , '\0' , sizeof(pong));
strcpy(pong , "PONG ");
strcat(pong , strchr(bufferReception , ':')); // Il y a bien une chaine de la forme "PONG :xxxxxxxxxx"
send(sock , pong , sizeof(pong) , 0); //Qui a la même forme que "tappée à la main"
}

Voilà la fonction. Elle me quote le ping comme "il faut" pourtant, mais il faut rentrer deux fois de suite les paramètres USER après ça.

Losque j'inverse les commande (en envoyant USER puis NICK), tout se passe correctement. En envoyant NICK puis USER sur les autres ircd, ça se passe bien. Ca a l'air de devoir être fait dans ce sens là, d'après la RFC. Si vous aviez une petite idée svp, ça ne serait pas de refus. Or not... ^^

Merci :)
Avatar de l’utilisateur
Shmolt
PanZani
 
Message(s) : 533
Inscription : Lun Jan 09, 2006 10:11 am
Localisation : Grenoble / Nancy

Message par Cesar » Mar Avr 03, 2007 12:25 pm

Il y a plusieurs problèmes:
- ton code est vulnérable si le serveur t'envoie un cookie plus long que ton buffer "pong"
- tu ne vérifies pas si il y a effectivement un :, si strchr échoue il renvoie NULL et strcat n'aimera pas
- send() prend en 3e argument la taille de la chaine à écrire pas la taille du buffer i.e. strlen(pong) (dans ton cas, la chaine étant initialisée, ça ne pose probablement pas de problème mais c'est une bonne pratique)
- le problème est sans doute là: on ignore comment est rempli bufferReception une ligne ? complète ? partielle ? N bytes pouvant recouvrir plusieurs lignes ?

Il serait utile de voir le code au dessus :)


Code : Tout sélectionner
if (!strncmp(bufferReception , "PING " ,  5))
{
     char bufferEnvoi[512];
     char *cookie = strchr(bufferReception, ':');

     if(cookie)
     {
          size_t send_buf_len = snprintf(bufferEnvoi, sizeof bufferEnvoi, "PONG %s", cookie);

          if(send_buf_len > sizeof bufferEnvoi) send_buf_len = sizeof bufferEnvoi;

          send(sock, bufferEnvoi, send_buf_len, 0);
     }
}
Cesar
Equipe IRCube
 
Message(s) : 329
Inscription : Lun Oct 24, 2005 6:09 pm

Message par Shmolt » Mar Avr 03, 2007 1:01 pm

Ah, bah, merci d'avoir répondu si vite, et plutôt clairement :)

Cesar a écrit :Il y a plusieurs problèmes:
- ton code est vulnérable si le serveur t'envoie un cookie plus long que ton buffer "pong"

Effectivement, détail oublié, merci.

- tu ne vérifies pas si il y a effectivement un :, si strchr échoue il renvoie NULL et strcat n'aimera pas

+1 ! En effet, ça fait pas mal goret. Pas pensé du tout :/


- le problème est sans doute là: on ignore comment est rempli bufferReception une ligne ? complète ? partielle ? N bytes pouvant recouvrir plusieurs lignes ?

Ce buffer est celui utilisé pour la réception, pendant tout le programme. Il sert à afficher tout ce qu'envoit le serveur, c'est le seul. C'est mal ? (Peut-être des conflits ou un truc dans le genre). Il est rempli toutes les lignes, apparement.

Il serait utile de voir le code au dessus :)


if (!strncmp(bufferReception , "PING " , 5))
{
char bufferEnvoi[512];
char *cookie = strchr(bufferReception, ':'); //en effet, ça fait moins goret ^^

if(cookie)
{
size_t send_buf_len = snprintf(bufferEnvoi, sizeof bufferEnvoi, "PONG %s", cookie); // ou comment s'en sortir sans strcat.. lol

if(send_buf_len > sizeof bufferEnvoi) send_buf_len = sizeof bufferEnvoi;

send(sock, bufferEnvoi, send_buf_len, 0);
}
}

J'essayerai ça. En tout cas, merci, en plus du ping, j'aurai appris pas mal de choses :D
Avatar de l’utilisateur
Shmolt
PanZani
 
Message(s) : 533
Inscription : Lun Jan 09, 2006 10:11 am
Localisation : Grenoble / Nancy

Message par Shmolt » Mar Avr 03, 2007 1:52 pm

Impecable, ça marche (on se sent un peu con).

*Ne plus programmer comme un goret*

Merci :)
Avatar de l’utilisateur
Shmolt
PanZani
 
Message(s) : 533
Inscription : Lun Jan 09, 2006 10:11 am
Localisation : Grenoble / Nancy


Retour vers CoderZ

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 3 invité(s)

cron