Retourner aux forums || Retourner au forum Programmation.c

Programmation.c : GNet / Glib

Posté par Fabien Penso (Jabber id, page perso, ) le 06 juillet 2004
0
Si quelqu'un utilise gnet et a une idée du problème suivant. Si je fais un telnet localhost 10201 puis un kill du telnet bien porc, le serveur me fait un SIGPIPE avec sous gdb :
(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:36
Et 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 }

--
blog them all :: la photo du jour
Je vote pour LinuxFr en Rails !
> Lire le message (5 commentaires, moyenne: 1,4).  

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.

D'après la doc...

Posté par Damien POBEL (page perso, ) le 06/07/2004 à 14:12. (lien). Évalué à 2.

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 ).

    --
    blog them all :: la photo du jour
    Je vote pour LinuxFr en Rails !

ben, il est ou le probleme ?

Posté par Maxime Petazzoni (page perso, ) le 11/07/2004 à 11:37. (lien). Évalué à 2.

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

--
Sam - Bulix.org - Zwe, moteur de weblog et site perso léger et modulaire.
  • [^]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