2017-01-20 5 views
0

gtkでgioソケットを使ってクライアントサーバを作成したいと思っていましたが、サーバにデータを送るためのサンプルコードが見つかりました。サーバーによって送信されます。以下のサンプルコード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内にフレーミングプロトコルが必要です。

関連する問題