首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由gio库实现的简单线程服务器

由gio库实现的简单线程服务器
EN

Stack Overflow用户
提问于 2015-08-26 10:37:44
回答 1查看 554关注 0票数 1

我正在努力学习吉奥图书馆,特别是giostream和gthreadedsocketservice。我想编写一个简单的服务器:

  1. 每个传入的连接将由一个单独的新线程处理。
  2. 在客户端,用户键入一个字符串并将其发送到服务器;在服务器端,在接收到该字符串时,立即将其显示为stdout。
  3. 除非服务器或客户端终止,否则连接不会关闭。也就是说,多条消息可以从客户端发送到服务器,而无需多次连接。

我尝试过的代码是:客户端:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glib.h>
#include <gio/gio.h>

int main(int argc, char* argv[]){
 GError* error = NULL;
 GSocketConnection* connection = NULL;
 GOutputStream* ostream = NULL;
 GSocketClient* client = g_socket_client_new();
 gchar message[1024];

 connection = g_socket_client_connect_to_host(client, (gchar*)"localhost", 1500, NULL, &error);

 if (error) {
  g_error(error->message);
  g_error_free(error);
  return 1;
 }
 else g_print("Message: connected.\n");

 while(TRUE){
  scanf("%s", message);
  ostream = g_io_stream_get_output_stream(G_IO_STREAM(connection));
  g_output_stream_write(ostream, message, strlen(message), NULL, &error);
  if (error) {
   g_error(error->message);
   g_error_free(error);
   return 1;
  }
 }

 g_print("Message: client terminated.\n");
 return 0;
}

服务器端:

代码语言:javascript
复制
#include <glib.h>
#include <gio/gio.h>

gboolean run_callback(GThreadedSocketService*, GSocketConnection*, GObject*, gpointer);

int main(int argc, char **argv){
 int port = 1500;
 GError* error = NULL;
 GMainLoop* loop = NULL;
 GThreadedSocketService* service = NULL;

 service = (GThreadedSocketService*)g_threaded_socket_service_new(-1);
 g_socket_listener_add_inet_port((GSocketListener*)service, port, NULL, &error);
 if (error != NULL) {g_error(error->message);}
 g_signal_connect(service, "run", G_CALLBACK(run_callback), NULL);
 g_socket_service_start((GSocketService*)service);
 g_print("Message: server launched...\n");
 loop = g_main_loop_new(NULL, FALSE);
 g_main_loop_run(loop);

 return 0;
}

gboolean run_callback(GThreadedSocketService* service, GSocketConnection* connection, GObject* source_object, gpointer user_data){
 GInputStream* instream = NULL;
 gchar message[1024];
 GError* error = NULL;

 instream = g_io_stream_get_input_stream(G_IO_STREAM(connection));
 g_input_stream_read_all(instream, message, 1024, NULL, NULL, &error);
 if (error != NULL) {
  g_error(error->message);
  g_error_free(error);
  return FALSE;
 }
 g_print("Received: %s\n", message);

 g_print("Message: connection terminated.\n");
 if (error) g_error_free(error);
 return FALSE;
}

问题是,当我测试它时,我在客户端输入了三行:

代码语言:javascript
复制
aaa
bbb
ccc

但是服务器端没有显示任何内容。只有当我退出客户端时,服务器屏幕上才会显示:

代码语言:javascript
复制
aaabbbccc

但我想要的是,当我输入"aaa“并输入,它立即显示在服务器屏幕上。

知道哪里出问题了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-26 10:43:27

问题是您使用了g_input_stream_read_all。注意到名字中的后缀all吗?这意味着它将尝试读取您传递给它的大小,只有在接收到所有这些字节或出现错误或断开连接时才返回。

相反,在循环中使用例如g_input_stream_read

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32224354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档