Sockets 尝试使用GUI程序创建gsocket服务器
我正在尝试在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 自从收到数据后,我怀疑我遗漏了一些简单的东西,但我花了好几个小时试图找出遗漏了什么,但都没有成功Sockets 尝试使用GUI程序创建gsocket服务器,sockets,gtk,gnome,gio,Sockets,Gtk,Gnome,Gio,我正在尝试在Raspberry Pi上使用GTK设置一个也有gui的服务器。该程序只是一个概念验证演示。 我创建了一个套接字,客户端可以连接和发送数据,我在wireshark中看到了它。但直到客户端断开连接,读取才会完成。我的代码使用g_数据、输入、流、读取、行、异步和g_数据、输入、流、读取、行、完成。程序显示客户端断开连接后客户端发送的数据。 这是程序的输出(即客户端发送的正确数据) g_套接字_侦听器_添加_inet_端口状态:1 g_信号_连接状态:2(在此等待,直到客户端连接) 已建立
// 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基本上解决了我的问题:这导致了一个新的问题…如何让服务器监听下一条消息?这是我最新问题的解决方案。