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 :

Probèmes connections serveurs IRC !


Sujet :

Réseau C

  1. #1
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Probèmes connections serveurs IRC !
    Bonjour (hé oui encore moi )

    Mon problème du jour : Impossible de me connecter sur des serveurs IRC quels qu'ils soient, sauf un t là ca deconne pas mal et je recois meme un ping timeout ...

    Un code vaut mieux qu'un long discours :

    Ma fonction de connection:
    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    int foncs_srv_connection (int current_tab)
    {
       int err = 0;
       int numbytes;
       gpointer p_st_data = NULL;
       _tab_s *p_tmp_tab_srv_s = NULL;
       char s_buffer[MAX_BUF_SIZE];
       GtkTextBuffer *p_buffer = NULL;
       GtkTextIter i_end;
     
     
       /* ---------------------------
          Recupere l'onglet courrant
       */
     
       pthread_mutex_lock (&the_mutex);
     
     
       /* On recupere la structure des widget */
       p_st_data = g_list_nth_data (p_tab_srv_chan_list, current_tab);
       p_tmp_tab_srv_s = p_st_data;
     
     
       if (p_tmp_tab_srv_s != NULL)
       {
          p_tmp_tab_srv_s->sock = socket (AF_INET, SOCK_STREAM, 0);
     
          if (p_tmp_tab_srv_s->sock != INVALID_SOCKET)
          {
             int sock_err;
             int ret = 0;
     
     
             /* Reglage de la socket */
             memset (&(p_tmp_tab_srv_s->indice),
                     0,
                     sizeof (struct addrinfo));
     
             p_tmp_tab_srv_s->indice.ai_family = AF_INET;
             p_tmp_tab_srv_s->indice.ai_socktype = SOCK_STREAM;
     
     
             /* Recupere les informations du serveur */
             ret = getaddrinfo (p_tmp_tab_srv_s->s_adr,
                                p_tmp_tab_srv_s->srv_port,
                                &(p_tmp_tab_srv_s->indice),
                                &(p_tmp_tab_srv_s->scan));
     
             if (ret)
             {
                dlg_show_message (
                   NULL,
                   GTK_MESSAGE_ERROR,
                   GTK_BUTTONS_OK,
                   "Impossible de faire la resolution de l'adresse du serveur !");
     
                return err = 1;
             }
     
     
             /* Connection au serveur */
             for (p_tmp_tab_srv_s->resultat = p_tmp_tab_srv_s->scan;
                  p_tmp_tab_srv_s->resultat;
                  p_tmp_tab_srv_s->resultat = p_tmp_tab_srv_s->resultat->ai_next)
             {
                if (connect (p_tmp_tab_srv_s->sock,
                             p_tmp_tab_srv_s->resultat->ai_addr,
                             p_tmp_tab_srv_s->resultat->ai_addrlen) == SOCKET_ERROR)
                {
                   perror ("connect");
                   err = 1;
                }
             }
     
     
             /* Authentification de l'utilisateur sur le serveur */
             if (err == 0)
             {
                char p_send_buf[MAX_BUF_SIZE];
     
     
                /* Envoie de la commande NICK au serveur */
                sprintf (p_send_buf, NICK_CMD, p_tmp_tab_srv_s->s_user_name);
     
                if ((numbytes = send (p_tmp_tab_srv_s->sock,
                                      p_send_buf,
                                      strlen (p_send_buf),
                                      0)) < 0)
                {
                   perror ("send");
                   err = 1;
                }
     
                /* Envoie de la commande USER au serveur */
                memset (p_send_buf, 0, sizeof (p_send_buf));
                sprintf (p_send_buf, USER_CMD, p_tmp_tab_srv_s->s_user_name,
                                               p_tmp_tab_srv_s->s_user_name,
                                               p_tmp_tab_srv_s->s_label_text,
                                               p_tmp_tab_srv_s->s_user_name);
     
                if ((numbytes = send (p_tmp_tab_srv_s->sock,
                                      p_send_buf,
                                      strlen (p_send_buf),
                                      0)) < 0)
                {
                   perror ("send");
                   err = 1;
                }
     
     
                memset (p_send_buf, 0, sizeof (p_send_buf));
             }
             else
             {
                /* Fermeture de la socket, liberation des ressources, suppression
                   des informations dans la liste chainee et suppression de
                   l'onglet. */
                gui_remove_tab (current_tab, p_tmp_tab_srv_s->tab_type_e);
             }
          }
          else
          {
             perror ("socket.open");
     
             dlg_show_message (
                NULL,
                GTK_MESSAGE_ERROR,
                GTK_BUTTONS_OK,
                "Impossible de se connecter, probleme d'ouverture du socket !");
     
             err = 1;
          }
       }
       else
       {
          dlg_show_message (
             NULL,
             GTK_MESSAGE_ERROR,
             GTK_BUTTONS_OK,
             "Une erreur s'est produite en recuperant les donnees "
             "de la page courrante !");
     
          err = 1;
       }
     
     
       pthread_mutex_unlock (&the_mutex);
       return err;
    }
    Son appel (je fait l'appel en brut dans le code comme ca, juste pour tester les connections etc...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gui_add_server_tab ("OFTC", "6667", "irc.epiknet.fr", "CSoldier");
    C'est avec ce serveur que ca deconne, voici la sortie que j'ai:
    :colombes.fr.epiknet.org NOTICE AUTH :*** Looking up your hostname...
    :colombes.fr.epiknet.org NOTICE AUTH :*** Checking ident...
    :colombes.fr.epiknet.org NOTICE AUTH :*** No ident response; username prefixed with ~
    :colombes.fr.epiknet.org NOTICE AUTH :*** Found your hostname
    ERROR :Closing Link: [83.196.241.182] (Ping timeout)
    Et la fonction de mon thread qui gere tous les messages entrants et les réponses aux ping des serveurs:
    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    void * foncs_messages_monitoring (void *p_data)
    {
       int numbytes;
       char s_buffer[1024];
       GtkTextBuffer *p_buffer = NULL;
       GtkTextIter i_end;
       gpointer p_st_data;
       _tab_s *p_tmp_tab_s = NULL;
       GList *p_list = NULL;
       fd_set fd_read;
       struct timeval the_time;
       int i = 0;
       int ret;
     
     
       /* ------------------------------------------
          Reglage du timeout de la fonction: select
       */
     
       the_time.tv_sec = 0;
       the_time.tv_usec = 250000;
     
     
     
     
       /* -------------------------------------
          Reception et traitement des messages
       */
    FILE *p_file = fopen ("thread.txt", "a+");
       while (!bln_quit)
       {
          pthread_mutex_lock (&the_mutex);
     
     
          if (p_tab_srv_chan_list != NULL)
          {
             FD_ZERO (&fd_read);
     
             i = 0;
             for (p_list = g_list_first (p_tab_srv_chan_list);
                  p_list;
                  p_list = p_list->next)
             {
                p_st_data = g_list_nth_data (p_list, i);
                p_tmp_tab_s = p_st_data;
     
                FD_SET (p_tmp_tab_s->sock, &fd_read);
                i++;
             }
     
     
             p_list = NULL;
             p_st_data = NULL;
             p_tmp_tab_s = NULL;
     
     
             if ((ret = select (FD_SETSIZE, &fd_read, NULL, NULL, &the_time)) < 0)
             {
                perror ("select");
             }
             else
             {
                /* On boucle sur toute la liste chainee */
                i = 0;
                for (p_list = g_list_first (p_tab_srv_chan_list);
                     p_list;
                     p_list = p_list->next)
                {
                   /* On recupere la structure des widget */
                   p_st_data = g_list_nth_data (p_list, i);
                   p_tmp_tab_s = p_st_data;
     
     
                   /* Reception d'un message */
                   if (FD_ISSET (p_tmp_tab_s->sock, &fd_read))
                   {
                      if ((numbytes = recv (p_tmp_tab_s->sock,
                                            s_buffer,
                                            MAX_BUF_SIZE,
                                            0)) <= 0)
                      {
                         perror ("recv");
                      }
                      else
                      {
                         /* Verification du message. Si c'est un PING, on repond
                             par un PONG. Sinon, on affiche le message a l'ecran. */
                         s_buffer[numbytes] = '\0';
     
    fprintf (p_file, "recv: %s\n", s_buffer);
     
                         if (strncmp (s_buffer, "PING", 4) == 0)
                         {
                            s_buffer[1] = 'O';
    fprintf (p_file, "send: %s\n", s_buffer);
     
                            /* Envoie de la reponse du PING */
                            if ((numbytes = send (p_tmp_tab_s->sock,
                                                  s_buffer,
                                                  MAX_BUF_SIZE,
                                                  0)) < 0)
                            {
                               perror ("send");
                            }
     
                            memset (s_buffer, 0, sizeof (s_buffer));
                         }
                         else
                         {
                            /* Recupere le buffer de la zone de texte */
                            p_buffer = gtk_text_view_get_buffer (
                               GTK_TEXT_VIEW (p_tmp_tab_s->p_text_view));
     
     
                            /* Affichage du message */
                            gtk_text_buffer_get_end_iter (p_buffer, &i_end);
                            gtk_text_buffer_insert (p_buffer, &i_end, s_buffer, -1);
     
                            memset (s_buffer, 0, sizeof (s_buffer));
                         }
                      }
                   }
     
                   i++;
                }
     
                p_list = NULL;
                p_st_data = NULL;
                p_tmp_tab_s = NULL;
                pthread_mutex_unlock (&the_mutex);
             }
          }
          else
          {
             pthread_mutex_unlock (&the_mutex);
             sleep (1);
          }
       }
    fclose (p_file);
     
     
     
       return NULL;
    }
    Le sleep (1); correspond à ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define sleep(s) Sleep(250*(s))
    En fait je ne vois pas pourquoi je n'arrive pas à me connecter correctement. Je ne doute même pas que mon code peut largement être amélioré et qu'il comporte très certainnement des erreurs, surtout niveau réseau ... c'est pour ca que je viens vous demander une ultime fois votre aide


    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    AH, au fait, 2 trucs que j'ai oublié de préciser:
    1°) Avec le select() qui attend, pourquoi fais-tu touours un sleep à la fin de chaque itération?
    2°) Le premier paramètre de select() n'est ignoré que sous Windows. Je pense que tu devrais mettre FD_SETSIZE au lieu de zéro, ce sera plus portable (et il me semble bien que ça marchera)

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Médinoc
    AH, au fait, 2 trucs que j'ai oublié de préciser:
    1°) Avec le select() qui attend, pourquoi fais-tu touours un sleep à la fin de chaque itération?
    Bah quand je lance le programme ou qu'aucune connection n'est en cours bah l'UC tour a fond les ballons !

    Citation Envoyé par Médinoc
    2°) Le premier paramètre de select() n'est ignoré que sous Windows. Je pense que tu devrais mettre FD_SETSIZE au lieu de zéro, ce sera plus portable (et il me semble bien que ça marchera)
    Pourtant l'avais mis hier j'me demande pourquoi je l'avais enlevé, sans doute un Ctrl-Z en trop

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    l'UC tourne à fond?
    Normalement, select() ne fait pas d'attente active... Il me semble qu'elle fait une vraie attente au niveau kernel...

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Médinoc
    l'UC tourne à fond?
    Oui tout le temps où ke programme tourne sans connections, dès que je lance une connection c'est bon ! Faut savoir que la boucle vachement moins longtemps si aucun connection est effective car la liste dans ce cas est vide et il passe donc tout le reste

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Ah, je crois que j'ai compris: sans connexion, select() retourne immédiatement, sans doute avec une erreur...

    Bref, tu peux faire un test si la liste est vide ou non, dans un cas tu fais un sleep(), dans l'autre un select()...

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Médinoc
    Ah, je crois que j'ai compris: sans connexion, select() retourne immédiatement, sans doute avec une erreur...

    Bref, tu peux faire un test si la liste est vide ou non, dans un cas tu fais un sleep(), dans l'autre un select()...
    Pas bête ca, j'y avais pas pensé

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Sinon rien de plus : Ca marche toujours pas ! Je sais pas quoi faire moua, chuis bloqué

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    BEn, je sais pas, mi...
    Essaie de débugguer en afifchant ce que tu envoies ou reçois, etc.

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Médinoc
    BEn, je sais pas, mi...
    Essaie de débugguer en afifchant ce que tu envoies ou reçois, etc.
    Deja fait, c'est pour cette raison que je sais qu'il ne recois même pas les messages PING du serveur distant et au pire il se connect meme sur les serveurs

Discussions similaires

  1. Connection Serveur Distant SQL Server 2000
    Par LeNeutrino dans le forum JBuilder
    Réponses: 2
    Dernier message: 16/11/2005, 11h45
  2. [Serveur] Installation d'un Serveur IRC
    Par Invité4 dans le forum IRC / mIRC
    Réponses: 6
    Dernier message: 17/08/2005, 20h23
  3. idftp et connection serveur
    Par jeromelef dans le forum Web & réseau
    Réponses: 4
    Dernier message: 27/07/2005, 18h41
  4. Connection Serveur Client
    Par d.w.d dans le forum C++
    Réponses: 16
    Dernier message: 21/02/2005, 12h17
  5. [socket] connexion à un serveur irc
    Par soad dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 19/11/2004, 03h59

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