2013-10-16 3 views
1

Je n'arrive toujours pas à lire les messages de réponse entrants provenant d'un élément matériel avec lequel mon programme communique. J'utilise GSocketClient et je suis capable de me connecter et d'envoyer des messages avec succès à l'aide de g_output_stream_write(). Je veux ensuite lire la réponse renvoyée par l'appareil, mais je n'ai aucun moyen de savoir combien d'octets la réponse sera pour utiliser g_input_stream_read(). J'ai aussi essayé d'utiliser g_input_stream_read_all(), mais cela semble bloquer l'application et ne jamais revenir. Je ne sais pas comment g_input_stream_read_all() détermine qu'il a atteint la fin d'un flux, mais je suppose que le problème est quelque part?En utilisant GSocketClient, comment lire les données entrantes sans connaître le nombre d'octets entrants?

Je sais qu'il y a des données entrantes car je peux utiliser g_input_stream_read() avec une taille d'octet inventé comme 5 et je vois alors les 5 premiers octets entrants, mais la taille de la réponse sera toujours différente. Donc, mes questions sont, est-il un moyen de déterminer combien de données sont en attente de lecture afin que je puisse le brancher dans g_input_stream_read() comme une variable pour la taille à lire? Et si non, quelle est l'utilisation correcte de g_input_stream_read_all() pour ne pas bloquer comme je le vois faire?

Répondre

0

Est-ce que quelque chose comme ce qui suit fonctionne?

#define BUF_SIZE 1024 
guint8 buffer[BUF_SIZE]; 
GByteArray *array = g_byte_array_new(); 
gsize bytes_read; 
GError *error = NULL; 

while (g_input_stream_read_all(istream, buffer, BUF_SIZE, &bytes_read, NULL, &error)) 
{ 
    g_byte_array_append(array, buffer, bytes_read); 
    if (bytes_read < BUF_SIZE) 
     /* We've reached the end of the stream */ 
     break; 
} 
if (error) 
    // error handling code 
+0

Hmm ... Je vais essayer ce soir. – DrRocket

Questions connexes