Hello,

yes, the first two bytes of the response is the message length. If i
explicitly read exactly two bytes (to get the message length) and then
explicitly read that many bytes to get the response, i’m fine.

What is not working as i expected is the polling. I thought that if i

* set the socket to non-blocking (g_socket_set_blocking())
* create a source for the socket with the G_IO_IN and G_IO_PRI flags
(inbound data + priority inbound data, although i’m pretty sure priority
inbound doesn’t happen on this protocol)
* set a callback function with g_source_set_callback()

then my callback will be called whenever there is data available. At least
that’s what i’d do if i’d be using plain Linux sockets, using
select()/poll()/epoll().

Best,
Gergely

mið., 23. jan. 2019 kl. 10:48 skrifaði Göran Hasse <gor...@raditex.nu>:

> Den 2019-01-10 kl. 15:02, skrev Gergely Polonkai:
> >
> > Hello,
>
> Hello,
>
> First. If you ar using a binary protocol - how do you recognise the
> frame?
>
> All socket reading sould recognice a frame header, where the size of
> the frame is stated and then read that amount of bytes. An alternative
> is to read one byte at a time and try to figure out when you have a
> frame end.
>
> /gh
>
>
> >
> > i’m working on an app that communicates with a network service using a
> > custom binary protocol.  For that i have a GSocketClient.  The
> > destination can, in theory, be either a TCP/IP or a UNIX socket (only
> > TCP/IP is implemented yet).  I initiate the connection like this:
> >
> >      scuttler->socket_client = g_socket_client_new();
> >
> >      address = g_inet_address_new_from_string("127.0.0.1");
> >      destination = g_inet_socket_address_new(address, 8008);
> >      g_object_unref(address);
> >
> >      g_task_set_task_data(task, g_object_ref(scuttler),
> (GDestroyNotify)g_object_unref);
> >
> >      g_socket_client_connect_async(scuttler->socket_client,
> G_SOCKET_CONNECTABLE(destination), cancellable, connection_finished, task);
> >
> > Then, in connecion_finished(), among other things, i do this:
> >
> >      scuttler->connection = connection;
> >
> >      if (!ssb_scuttler_shs_connect(scuttler, &err)) {
> >          g_task_return_error(task, err);
> >          g_object_unref(task);
> >
> >          return;
> >      }
> >
> >      socket = g_socket_connection_get_socket(connection);
> >      g_socket_set_blocking(socket, FALSE);
> >      socket_source = g_socket_create_source(socket, G_IO_IN | G_IO_PRI,
> NULL);
> >      g_source_set_callback(socket_source,
> >                            (GSourceFunc)read_inbound,
> >                            g_object_ref(scuttler), g_object_unref);
> >      g_source_attach(socket_source, g_main_context_get_thread_default());
> >
> > However, my read_inbound() function never gets called, even though my
> > request ends up in the server (i can see it in the logs).  Am i missing
> > something fundamental here?
> >
> > (Also, this is not really GTK, but more like GLib/GIO specific; if there
> > is a better mailing list to send this, please advise.)
> >
> > Best,
> > Gergely
> > _______________________________________________
> > gtk-list mailing list
> > gtk-list@gnome.org
> > https://mail.gnome.org/mailman/listinfo/gtk-list
> >
>
>
> --
> -----------------------------
> Göran Hasse
> Raditex Control AB
> http://www.rscada.se http://www.raditex.nu
> Boo 229, 715 91 ODENSBACKEN
> Phone: +46 19 450105
> Mobile: 070-5530148
>
>
>
_______________________________________________
gtk-list mailing list
gtk-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-list

Reply via email to