Retourner aux forums || Retourner au forum Programmation.c
(gdb) bt #0 0x4010b908 in write () from /lib/libc.so.6 #1 0x401f1398 in g_io_watch_funcs () from /usr/lib/libglib-2.0.so.0 #2 0x401910d2 in g_io_channel_write () from /usr/lib/libglib-2.0.so.0 #3 0x40032fea in gnet_io_channel_writen () from /usr/lib/libgnet-2.0.so.0 #4 0x08048a87 in main (argc=1, argv=0xbffff9a4) at server.c:36Et je ne trouve pas pourquoi. Le gnet_io_channel_writen() sembler merder si la connexion est terminée. Donc si quelqu'un a un exemple de code idiotproof pour faire ce genre de chose, je suis preneur. Le code du serveur :
1 #include <unistd.h>
2 #include <glib.h>
3 #include <gnet.h>
4
5 int main(int argc, char *argv[])
6 {
7 GTcpSocket* server=NULL;
8 GInetAddr* addr=NULL;
9 GTcpSocket* client = NULL;
10 GIOChannel* ioclient = NULL;
11 gchar* hostname="localhost";
12 gchar* name;
13 gint port=10201;
14
15 gnet_init();
16
17 server = gnet_tcp_socket_server_new_full(gnet_inetaddr_new(hostname,port), port);
18 addr = gnet_tcp_socket_get_local_inetaddr(server);
19 name = gnet_inetaddr_get_canonical_name (addr);
20 port = gnet_inetaddr_get_port (addr);
21 g_print ("Server running on (%s)(%d)(%s)\n", name, port, gnet_inetaddr_get_name (addr));
22
23 while ((client = gnet_tcp_socket_server_accept (server)) != NULL)
24 {
25 GIOError error;
26 guint n;
27 gchar* buffer = "something to say\n";
28
29 ioclient = gnet_tcp_socket_get_io_channel(client);
30 addr = gnet_tcp_socket_get_remote_inetaddr(client);
31 name = gnet_inetaddr_get_canonical_name (addr);
32 port = gnet_inetaddr_get_port (addr);
33 g_print ("Accepted connection from %s:%d\n", name, port);
34
35 while(1) {
36 error = gnet_io_channel_writen(ioclient, buffer, strlen(buffer), &n);
37 if (error != G_IO_ERROR_NONE) {
38 g_print("oups\n");
39 gnet_tcp_socket_delete (client);
40 }
41 sleep(1);
42 }
43 }
44
45 return 1;
46 }
> Lire le message (5 commentaires, moyenne: 1,4).
D'après la doc...
http://www.gnetlibrary.org/docs/gnet-tcp.html#GNET-TCP-SOCKET-GET-I(...)
je suis tenté de dire que quand tu ferme ta connexion, tu passes par la ligne 39 (gnet_tcp_socket_delete (client);) ce qui fait que ta variable ioclient qui tu as créé plus haut avec la var. client ne correspond plus à rien. Un petit break; après la ligne 39 pourrait peut être résoudre ton problème mais je suis pas sur et j'ai pas trop le temps de lire toute la doc (excellente en passant) de la libgnet.
-
[^]Re: D'après la doc...
Posté par Fabien Penso (Jabber id, page perso, ) le 06/07/2004 à 14:14. (lien). Évalué à 2.Ca aurait pu, mais justement non ça ne passe pas par là. C'est bien pour ça que je ne comprends pas ( enfin tu as raison, il faut quand même inclure un break ).
ben, il est ou le probleme ?
c'est pas un peu normal que le serveur recoive un SIGPIPE quand le client a l'autre bout ferme sa socket "précipitament" ?
si je ne m'abuse, que ce soit gnet ou pas ne change rien, c'est un comportement tout a fait normal et prévisible, qu'il faut gérer. un recv() sur une socket fermée renverra -1, EPIPE dans errno() et générera un SIGPIPE
vala.
- sam
-
[^]Re: ben, il est ou le probleme ?
Posté par gc (page perso, ) le 17/07/2004 à 11:44. (lien). Évalué à 2.-1 et EPIPE je veux bien mais SIGPIPE ca rend quand meme les choses compliquées au niveau du serveur...
dans mon serveur frozen-bubble, si je kill -9 le process perl qui s'y est connecté, je n'ai pas de SIGPIPE, je n'ai même pas -1 dans recv mais 0 d'ailleurs.-
[+] [^]Re: ben, il est ou le probleme ?
Posté par laurent belmonte (Jabber id, page perso, ) le 27/07/2004 à 08:19. (lien). Évalué à -1.pareil dans mon serveur monkey bubble ;)
De tout maniere je n'utilise pas gnet car il n'est pas inclu dans la plateforme de dev de gnome
-
Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.c



Cette discussion est archivée, il n'est plus possible de laisser des commentaires.
Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.