1

我仍在努力从我的程序正在与之通信的硬件中读取传入的响应消息。

我正在使用 GSocketClient,并且能够使用 g_output_stream_write() 连接并成功发送消息。然后我想读取从设备发回的响应,但我无法知道回复将有多少字节才能使用 g_input_stream_read()。我也尝试过使用 g_input_stream_read_all(),但这似乎会阻止应用程序并且永远不会返回。我不知道 g_input_stream_read_all() 如何确定它已到达流的末尾,但我认为问题出在某个地方?

我知道有传入数据,因为我可以使用 g_input_stream_read() 和 5 这样的虚构字节大小,然后我会看到前 5 个传入字节,但响应大小总是不同的。

所以我的问题是,有没有办法确定有多少数据正在等待读取,以便我可以将其插入 g_input_stream_read() 作为要读取的大小的变量?如果不是,那么 g_input_stream_read_all() 的正确用法是什么让它不会像我看到的那样阻塞?

4

1 回答 1

0

像下面这样的工作吗?

#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
于 2013-10-17T06:21:09.377 回答