Попытка создать сервер gsocket с помощью программы с графическим интерфейсом

Я пытаюсь настроить сервер с графическим интерфейсом, используя GTK на Raspberry Pi. Программа представляет собой всего лишь демо-версию концепции. Я создаю сокет, и клиент может подключиться и отправить данные, я вижу это в wireshark. Но чтение не завершается до тех пор, пока клиент не отключится. В моем коде используются g_data_input_stream_read_line_async и g_data_input_stream_read_line_finish. Программа отображает данные, отправленные клиентом после отключения клиента. Вот вывод программы (это правильные данные, которые были отправлены клиентом).

Статус g_socket_listener_add_inet_port: 1

Статус g_signal_connect: 2 (ожидает здесь, пока клиент не подключится)

соединение сокета установлено!

после g_data_input_stream_new

после g_data_input_stream_set_newline_type

после g_data_input_stream_read_line_async (ожидает здесь после подключения клиента и после отправки клиентом данных)

до g_data_input_stream_read_line_finish (отображает оставшиеся строки вывода после отключения клиента)

после g_data_input_stream_read_line_finish

длина: 14

0 5 0 4 0 1 0 1 0 6 0 0 0 7

Я подозреваю, что упускаю что-то простое с момента получения данных, но я потратил довольно много часов, безуспешно пытаясь понять, чего не хватает.

// compiles with:
// gcc `pkg-config --cflags gtk+-3.0` gtk3serv.c -o gtk3serv `pkg-config --libs gtk+-3.0`


#include <gtk/gtk.h>
#include <gio/gio.h>

static void
print_hello (GtkWidget *widget,
             gpointer   data)
{
  g_print ("Hello World\n");
}

static void
activate (GtkApplication *app,
          gpointer        user_data)
{
  GtkWidget *window;
  GtkWidget *button;
  GtkWidget *button_box;

  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

  button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
  gtk_container_add (GTK_CONTAINER (window), button_box);

  button = gtk_button_new_with_label ("Hello World");
  g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
  g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
  gtk_container_add (GTK_CONTAINER (button_box), button);

  gtk_widget_show_all (window);
}

// v<>v<>v<>v<>v<>v<>v<>v<>v<>v<>v

static void on_input_read_finish(GObject      *object,
                                 GAsyncResult *result,
                                 gpointer     user_data)
{
  gchar *clientdata;
  gsize length = -1;
  gsize i;

  g_print("before g_data_input_stream_read_line_finish\n"); // only for debug

  clientdata = g_data_input_stream_read_line_finish(G_DATA_INPUT_STREAM(object), 
                                                    result,
                                                    &length, 
                                                    NULL);
  g_print("after g_data_input_stream_read_line_finish\n"); // only for debug

  g_print("length: %d\n", length); // only for debug

  for(i=0; i<length; i++)
  {
    g_print("%x ", clientdata[i]);
  }
  g_print("\n");

}


gboolean sockconnectionestablished(GSocketService *sockservice,
                                   GSocketConnection *connection,
                                   GObject *source_object,
                                   gpointer user_Data)
{
  char *clientdata;
  gsize length = -1;
  gsize i;

  g_print("socket connection established!\n"); // only for debug

  GDataInputStream *gis = g_data_input_stream_new(g_io_stream_get_input_stream(G_IO_STREAM(connection)));

  g_print("after g_data_input_stream_new\n"); // only for debug

  g_data_input_stream_set_newline_type(G_DATA_INPUT_STREAM(gis), G_DATA_STREAM_NEWLINE_TYPE_ANY);

  g_print("after g_data_input_stream_set_newline_type\n"); // only for debug

  g_data_input_stream_read_line_async(G_DATA_INPUT_STREAM(gis),
                                      G_PRIORITY_DEFAULT,
                                      NULL,
                                      on_input_read_finish,
                                      NULL);
  g_print("after g_data_input_stream_read_line_async\n"); // only for debug

  return 1;
}                                   

// ^<>^<>^<>^<>^<>^<>^<>^<>^<>^<>^

int
main (int    argc,
      char **argv)
{
  GtkApplication *app;
  int status;

// v<>v<>v<>v<>v<>v<>v<>v<>v<>v<>v
  GError *sockerror = NULL;
  GSocketService *sockservice;
  gboolean sockstatus;

  sockservice = g_socket_service_new();

  sockstatus =  g_socket_listener_add_inet_port(G_SOCKET_LISTENER(sockservice),
                                                8888,
                                                NULL,
                                                NULL);

  g_print("g_socket_listener_add_inet_port status: %d\n", sockstatus); // only for debug

  status = g_signal_connect(sockservice,
                   "incoming",
                   G_CALLBACK(sockconnectionestablished),
                   NULL);
  g_print("g_signal_connect status: %d\n", status); // only for debug

// ^<>^<>^<>^<>^<>^<>^<>^<>^<>^<>^

  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status;
}

person jollymonrogers    schedule 22.05.2018    source источник
comment
Ответ 5 на этот вопрос в значительной степени решает мою проблему: "> stackoverflow.com/questions/9513327/   -  person jollymonrogers    schedule 22.05.2018
comment
Что приводит к новой проблеме... как заставить сервер слушать следующее сообщение?   -  person jollymonrogers    schedule 22.05.2018
comment
И это: stackoverflow.com/questions/39184621/ было решением моей последней проблемы.   -  person jollymonrogers    schedule 23.05.2018