2017-01-20 9 views
0

gtk에서 gio socket을 사용하여 클라이언트 서버를 작성하고 서버에 데이터를 보내는 샘플 코드를 찾았지만 데이터를 읽는 것이 더 많습니다./답장 서버가 보낸 아래는 샘플 코드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 연결을 열므로 메시지 기반 I/O 대신 여기에서 스트림 기반 I/O를 수행해야합니다. 서버와주고받는 메시지를 보내려면 TCP 내에 프레이밍 프로토콜이 필요합니다.