GTK GIO如何阅读服务器发送的回复

时间:2017-01-20 07:39:48

标签: sockets glib gtk2 gio

我想在gtk中使用gio socket写一个客户端服务器的东西,我发现了一个示例代码将数据发送到服务器但是,我想要的更多就是读取服务器发送的数据/回复。以下是示例代码

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

int main (int argc, char *argv[])
{
   /* initialize glib */
  g_type_init ();

  GError * error = NULL;

  /* create a new connection */
  GSocketConnection * connection = NULL;
  GSocketClient * client = g_socket_client_new();

  /* connect to the host */
  connection = g_socket_client_connect_to_host (client,
                                           (gchar*)"localhost",
                                            1500, /* your port goes here */
                                            NULL,
                                            &error);

  /* don't forget to check for errors */
  if (error != NULL)
  {
      g_error (error->message);
  }
  else
  {
      g_print ("Connection successful!\n");
  }

  /* use the connection */
  GInputStream * istream = g_io_stream_get_input_stream (G_IO_STREAM (connection));
  GOutputStream * ostream = g_io_stream_get_output_stream (G_IO_STREAM (connection));
  g_output_stream_write  (ostream,
                      "Hello server!", /* your message goes here */
                      13, /* length of your message */
                      NULL,
                      &error);
  /* don't forget to check for errors */
  if (error != NULL)
  {
      g_error (error->message);
  }
  return 0;
}

上面的代码适用于向服务器发送数据,但是当我尝试从输入流中读取它时,它会进入阻塞状态。我的阅读消息功能看起来像这样

 void readMessage()
 {
    char buffer[2048];
    GInputStream * istream = g_io_stream_get_input_stream (G_IO_STREAM(connection));
    gssize bytes;
    bytes = g_input_stream_read(istream, buffer, sizeof buffer, NULL, NULL);
    buffer[bytes] = '\0';
    g_print ("%"G_GSSIZE_FORMAT" bytes read: %s\n", bytes, buffer);
 }

1 个答案:

答案 0 :(得分:0)

g_input_stream_read()被记录为阻塞,直到它收到您请求的字节数(在本例中为2048),或者直到连接关闭为止。据推测,这些事情都没有发生。服务器的回复有多大?是否在发送回复后关闭连接?

请记住g_socket_client_connect_to_host()打开了一个TCP连接,所以你应该在这里做基于流的I / O,而不是基于消息的I / O.如果您希望与服务器之间发送消息,则需要TCP中的成帧协议。