2017-01-20 3 views
0

Я хотел написать файл клиентского сервера с помощью gio-сокета в gtk, и я нашел пример кода для отправки данных на сервер, но чем больше я хочу прочитать данные/ответ отправленных сервером. Ниже приведен пример кодаGTK GIO Как читать ответ, отправленный сервером

#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); 
} 

ответ

0

g_input_stream_read() документирована как блокирование до тех пор, пока не получит столько байт, сколько вы запрашиваете (в данном случае, 2048), или до тех пор, пока соединение не будет закрыто. Предположительно, ни одна из этих вещей не происходит. Насколько велик ответ с сервера? Закрывает ли соединение после отправки ответа?

Имейте в виду, что g_socket_client_connect_to_host() открывает TCP-соединение, поэтому вы должны ожидать здесь ввода-вывода на основе потоков, а не ввода-вывода на основе сообщений. Если вы планируете отправлять сообщения на сервер и с него, вам потребуется протокол кадрирования в TCP.