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 :

Probleme avec select


Sujet :

Réseau C

  1. #1
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut Probleme avec select
    Salut,

    J'ai un probleme avec la fonction select
    Ma fonction est "en attente" de reception (mais non bloquante).
    Voici son code :
    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
    /* Fonction en attente de reception d'un message sous la forme login : message */
    void receive(gpointer donnees)
    {
    	data* pData = donnees;
    	if ( pData->verifConnect == 1 )
    	{
    		struct timeval tv;
    		int retselect;
     
    		printf("Deb fonction\n");		
    		FD_ZERO(&(pData->monFds));
    		FD_SET(pData->maSocket,&(pData->monFds));
    		memset(&tv, 0, sizeof(tv));
          retselect = select((pData->maSocket) + 1,&(pData->monFds),NULL,NULL,&tv);
          printf("reselect = %d\n",retselect);
    	}
    }
    Le code n'est bien evidemment qu'en phase d'approche
    voici le probleme : dèsque j'envoie un message, retselect passe à 1 (ok jusqu'ici tout va bien) mais il le reste indefinement pour chaque appel de la fonction
    Pourtant le fds de lecture est bien réinitialisé avant chaque appel à select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FD_ZERO(&(pData->monFds));
    FD_SET(pData->maSocket,&(pData->monFds));
    Voici la structure data :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct
    	{
    		GtkWidget *pFenetre;			/* Fenetre principale */
    		/* ... */
    		SOCKET maSocket;
    		fd_set monFds;
    		int verifConnect;					/* 1 ==> connecté au serveur, sinon 0 */
    	}data;
    Je n'arrive pas à comprendre pourquoi le fds n'est pas correctement réinitialisé, ou alors pourquoi select renvoie toujours 1, alors que je n'envoie qu'UN seul message
    Merci pour votre aide
    Sorry
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retselect = select((pData->maSocket) + 1,&(pData->monFds),NULL,NULL,&tv);
    Select prévient qu'une donnée est prête à être lue mais si tu ne vides pas le flux en lisant select rendra tourjous 1 disant "le flux a encore des données"...

  3. #3
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par fearyourself
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retselect = select((pData->maSocket) + 1,&(pData->monFds),NULL,NULL,&tv);
    Select prévient qu'une donnée est prête à être lue mais si tu ne vides pas le flux en lisant select rendra tourjous 1 disant "le flux a encore des données"...
    Ok
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  4. #4
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    J'ai complété ma fonction :
    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
    void receive(gpointer donnees)
    {
    	data* pData = donnees;
    	if ( pData->verifConnect == 1 )
    	{
    		fd_set rfds;
    		struct timeval tv;
    		int retselect;
    		char buffer[127];
     
    		printf("Deb fonction\n");		
    		FD_ZERO(&rfds);
    		FD_SET(pData->maSocket,&rfds);
    		memset(&tv, 0, sizeof(tv));
          retselect = select((pData->maSocket) + 1,&rfds,NULL,NULL,&tv);
          printf("reselect = %d\n",retselect);
          if ( retselect > 0 )
          {
          	recv(pData->maSocket,buffer,127,0);
          	puts(buffer);
          }
    	}
    }
    Mais le problème n'est pas réglé :
    au premier passage dans la fonction apres l'envoie du message, retselect passe bien à 1 et le message est affiché
    mais pour tous les passages suivants, retselect reste à 1 et n'importe quoi est reçu et affiché

    Voici le bout de code qui envoit le message, si jamais le probleme vient de là...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char erreur404[127] = "Desole vous n'etes pas dans la base de donnees...\0";
    int oct_env;
    oct_env = send(newClient,erreur404,127,0);
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Je ne mettrais pas ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char erreur404[127] = "Desole vous n'etes pas dans la base de donnees...\0";
    Mais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char erreur404[127] = "Desole vous n'etes pas dans la base de donnees...";
    Car le '\0' se met automatiquement

    Je ne mettrais pas ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oct_env = send(newClient,erreur404,127,0);
    Mais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oct_env = send(newClient,erreur404,strlen(erreur404),0);
    Jc

  6. #6
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    ok j'ai corrigé, merci pour la correction.
    Malheureusement ça ne règle pas le problème
    recv continue de trop recevoir
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Est-il possible que tu fermes la connection du côté serveur ou que la connection se ferme entre temps? Je crois me souvenir d'un problème si la socket se fermait mais je peux me tromper...

  8. #8
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par fearyourself
    Est-il possible que tu fermes la connection du côté serveur ou que la connection se ferme entre temps? Je crois me souvenir d'un problème si la socket se fermait mais je peux me tromper...
    Oui en effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* Client inconnu ! */
    char erreur404[127] = "Desole vous n'etes pas dans la base de donnees...";
    int oct_env;
    /* On envoie un message d'erreur au client inconnu */
    oct_env = send(newClient,erreur404,strlen(erreur404),0);
    if ( oct_env == -1 )
    {
       perror("send() 404error");
    }
    /* On ferme la socket */
    closesocket(newClient);
    Mais mon serveur, doit ici refuser la connection du client (car pas connu) donc je ferme la socket.

    Edit : un shutdown avant le closesocket serait peut etre mieux, non ?
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  9. #9
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Le client n'a qu'à vérifier que le serveur à fermer la socket et donc mettre ta variable verifConnect à 0...

    recv doit rendre -1 s'il y a un problème, je suppose que cela inclut que le socket soit fermé de l'autre côté... Il faudrait vérifier...

  10. #10
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par fearyourself
    recv doit rendre -1 s'il y a un problème, je suppose que cela inclut que le socket soit fermé de l'autre côté... Il faudrait vérifier...
    Exact, je suis idiot de pas avoir testé le retour de recv avant d'afficher...
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    lorsque le socket est fermé proprement, recv() ne retourne pas -1 mais zéro...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    lorsque le socket est fermé proprement, recv() ne retourne pas -1 mais zéro...
    Exact, de la page man:

    These calls return the number of bytes received, or -1 if an error occurred. The return value will be 0 when the peer has performed an orderly shutdown.
    Jc

  13. #13
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Ok, donc j'ai corrigé ma fonction, voici la derniere version :

    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
    void receive(gpointer donnees)
    {
    	data* pData = donnees;
    	printf("VerifConnect = %d\n",pData->verifConnect);
    	if ( pData->verifConnect == 1 )
    	{
    		fd_set rfds;
    		struct timeval tv;
    		int retselect;
    		char buffer[127];
     
    		printf("Deb fonction\n");
    		FD_ZERO(&rfds);
    		FD_SET(pData->maSocket,&rfds);
    		memset(&tv, 0, sizeof(tv));
          retselect = select((pData->maSocket) + 1,&rfds,NULL,NULL,&tv);
          printf("retselect : %d\n",retselect);
          if ( retselect > 0 )
          {
          	int recsize = recv(pData->maSocket,buffer,127,0);
          	if (  recsize > 0)
          	{
          		printf("%d octets reçus : %s\n",recsize,buffer);
          	}
          	else
          	{
          		if ( recsize == 0 )
          		{
    		  			printf("Fermeture socket...\n");
          			shutdown(pData->maSocket,2);
          			closesocket(pData->maSocket);
          			pData->verifConnect = 0;
          		}
          		else
          		{
          			perror("recv()");
          		}
          	}
          }
    	}
    }
    Donc je me connecte au serveur, et lui envoie un login invalide.
    Le message d'erreur est reçu, affiché mais ça deborde :
    49 octets reçus : Desole vous n'etes pas dans la base de donnees...\uffff \uffff\uffff_\uffffb
    De plus, ensuite ma fonction n'est plus appellée une fois que la socket est fermée, puisque seul :
    VerifConnect = 1
    est écrit en dessous..des qu'il repasse à 0 plus rien n'est affiché donc le programme n'appelle plus la fonction

    Je ne comprend plus rien
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  14. #14
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Le '\0' n'est pas envoyé et donc pas reçu donc à l'affichage ça déborde...

    C'est ma faute, je t'ai dit de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    send(erreur404,strlen(erreur404));
    Or il faudrait mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    send(erreur404,strlen(erreur404)+1); //pour prendre en compte le '\0'
    Jc

    EDITION: Par contre fais attention, si mes souvenirs sont bons, TCP permet de découper les trames (ségmentation des données) donc il se peut qu'un envoi par send se retrouve découper... Il faudrait donc plusieurs recv pour tout récupérer...

    Une solution est de faire un select pour voir s'il y a quelque chose dans la socket et dès qu'il y a quelque chose, faire une boucle do..while(select..) tant qu'il ya quelque chose dans la socket

  15. #15
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Ok merci en effet le probleme de debordement est maintentant corrigé.
    Par contre, une fois la socket fermée, recv reçoit bien 0, donc je ferme la socket du client et met verifConnect à 0. Mais à partir de ce moment la fonction receive n'est plus du tout appellée sauf si je rajoute à la fin de cette derniere un printf
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  16. #16
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Tu as enlevé cette ligne aussi?

    printf("VerifConnect = %d\n",pData->verifConnect);
    Tu veux dire que si tu rajoutes un printf, tout marche mais sinon même le premier printf ne s'affiche plus?

    Jc

  17. #17
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par fearyourself
    Tu as enlevé cette ligne aussi?

    printf("VerifConnect = %d\n",pData->verifConnect);
    Tu veux dire que si tu rajoutes un printf, tout marche mais sinon même le premier printf ne s'affiche plus?

    Jc
    Non je laisse le 1er printf, comme ça je vois si je rentre ou non dans la fonction.
    Quand je rajoute un printf à la fin j'y rentre tout le temps sans probleme, quand je le retire j'y rentre plus.
    C'est peut etre le timer Gtk qui fait des siennes...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_timeout_add(100,(GSourceFunc)receive,&myData);
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est réglé: cet ahuri avait mal déclaré sa callback : Elle est supposée retourner un gboolean qui retire le timer si FALSE...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Médinoc
    C'est réglé: cet ahuri avait mal déclaré sa callback
    Pas gentil.
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pas gentil peut-être, mais ça t'avait été dit presque dès le début, et tu n'avais pas corrigé!
    Et en plus, j'avais un autre mot qu'ahuri aux doigts, je me suis autocensuré par politesse...

    Edit: 'fait suer, pas moyen de retrouver l'image du clavier abrutyuiop...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. probleme avec select multiple
    Par koukoya dans le forum Struts 1
    Réponses: 1
    Dernier message: 19/10/2006, 13h10
  2. probleme avec SELECT..FROM..WHERE
    Par VBBBA dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 08/09/2006, 15h58
  3. [EJB3][HIBERNATE] Probleme avec select max
    Par kristof_machin dans le forum Hibernate
    Réponses: 2
    Dernier message: 26/04/2006, 13h05
  4. [VB]probleme avec select case
    Par mickael99 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 03/02/2006, 14h07
  5. Probleme avec Select Case
    Par GeffD dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 07/03/2005, 15h28

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