(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 Damien Pobel (site web personnel) . Évalué à 2.
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
[^] # Re: D'après la doc...
Posté par Fabien Penso (site web personnel, Mastodon) . Évalué à 2.
# ben, il est ou le probleme ?
Posté par samds . Évalué à 2.
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 (site web personnel) . Évalué à 2.
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 drchaos (site web personnel) . Évalué à -1.
De tout maniere je n'utilise pas gnet car il n'est pas inclu dans la plateforme de dev de gnome
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.