Forum Programmation.c GNet / Glib

Posté par  (site web personnel, Mastodon) .
Étiquettes : aucune
0
6
juil.
2004
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 }
  • # D'après la doc...

    Posté par  (site web personnel) . É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.

    https://damien.pobel.fr

  • # ben, il est ou le probleme ?

    Posté par  . É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
    • [^] # Re: ben, il est ou le probleme ?

      Posté par  (site web personnel) . É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.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.