Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 尝试使用GUI程序创建gsocket服务器_Sockets_Gtk_Gnome_Gio - Fatal编程技术网

Sockets 尝试使用GUI程序创建gsocket服务器

Sockets 尝试使用GUI程序创建gsocket服务器,sockets,gtk,gnome,gio,Sockets,Gtk,Gnome,Gio,我正在尝试在Raspberry Pi上使用GTK设置一个也有gui的服务器。该程序只是一个概念验证演示。 我创建了一个套接字,客户端可以连接和发送数据,我在wireshark中看到了它。但直到客户端断开连接,读取才会完成。我的代码使用g_数据、输入、流、读取、行、异步和g_数据、输入、流、读取、行、完成。程序显示客户端断开连接后客户端发送的数据。 这是程序的输出(即客户端发送的正确数据) g_套接字_侦听器_添加_inet_端口状态:1 g_信号_连接状态:2(在此等待,直到客户端连接) 已建立

我正在尝试在Raspberry Pi上使用GTK设置一个也有gui的服务器。该程序只是一个概念验证演示。 我创建了一个套接字,客户端可以连接和发送数据,我在wireshark中看到了它。但直到客户端断开连接,读取才会完成。我的代码使用g_数据、输入、流、读取、行、异步和g_数据、输入、流、读取、行、完成。程序显示客户端断开连接后客户端发送的数据。 这是程序的输出(即客户端发送的正确数据)

g_套接字_侦听器_添加_inet_端口状态:1

g_信号_连接状态:2(在此等待,直到客户端连接)

已建立套接字连接

g_数据_输入_流_新建后

在g\U数据\u输入\u流\u设置\u换行\u类型之后

在g_数据\u输入\u流\u读取\u行\u异步之后(在客户端连接之后和客户端发送数据之后在此等待)

g_数据_输入_流_读取_行_完成之前(显示客户端断开连接后剩余的输出行)

g\u数据\u输入\u流\u读取\u行\u完成后

长度:14

05040101060007

自从收到数据后,我怀疑我遗漏了一些简单的东西,但我花了好几个小时试图找出遗漏了什么,但都没有成功

// 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;
}
//编译时使用:
//gcc`pkg config--cflags gtk+-3.0`gtk3serv.c-o gtk3serv`pkg config--libs gtk+-3.0`
#包括
#包括
静态空隙
打印hello(GtkWidget*小部件,
gpointer数据)
{
g_print(“Hello World\n”);
}
静态空隙
激活(GTK应用程序*应用程序,
gpointer用户(U数据)
{
GtkWidget*窗口;
GtkWidget*按钮;
GtkWidget*按钮盒;
窗口=gtk_应用程序_窗口_新(应用程序);
gtk_窗口设置标题(gtk_窗口(窗口),“窗口”);
gtk_窗口设置默认大小(gtk_窗口(窗口),200200);
按钮盒=gtk按钮盒新(gtk方向水平);
gtk_容器添加(gtk_容器(窗口)、按钮盒);
button=gtk_button_new_,带_标签(“Hello World”);
g_信号连接(按钮“点击”,g_回调(打印\u hello),空);
g_信号连接交换(按钮,“点击”,g_回调(gtk_小部件销毁),窗口);
gtk_容器添加(gtk_容器(按钮盒),按钮);
gtk_小部件_全部显示(窗口);
}
//VVVVVV
输入读取完成时静态无效(GObject*对象,
GAsyncResult*结果,
gpointer用户(U数据)
{
gchar*客户数据;
gsize长度=-1;
gsi;
g_print(“g_data_input_stream_read_line_finish\n之前”);//仅用于调试
clientdata=g_数据\u输入\u流\u读取\u行\u完成(g_数据\u输入\u流(对象),
结果,,
&长度,
无效);
g_print(“g_data_input_stream_read_line_finish\n)之后);//仅用于调试
g_print(“长度:%d\n”,长度);//仅用于调试

对于(i=0;i)这个问题的回答5基本上解决了我的问题:这导致了一个新的问题…如何让服务器监听下一条消息?这是我最新问题的解决方案。