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:
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
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; }
C'est avec ce serveur que ca deconne, voici la sortie que j'ai:
Code : Sélectionner tout - Visualiser dans une fenêtre à part gui_add_server_tab ("OFTC", "6667", "irc.epiknet.fr", "CSoldier");
Et la fonction de mon thread qui gere tous les messages entrants et les réponses aux ping des serveurs::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)
Le sleep (1); correspond à ca:
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; }
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define sleep(s) Sleep(250*(s))
Merci d'avance
Partager