如何在一个线程中循环读取GSocket
时间: 2024-03-23 18:39:18 浏览: 15
你可以使用以下代码在一个线程中循环读取GSocket:
```c
void read_socket(GSocket *socket) {
GInputStream *input_stream = g_io_stream_get_input_stream(G_IO_STREAM(socket));
gsize message_length;
gchar *message;
while (TRUE) {
if (g_input_stream_read(input_stream, &message, sizeof(gsize), NULL, NULL) == sizeof(gsize)) {
message_length = *((gsize *) message);
g_free(message);
message = NULL;
if (message_length > 0) {
message = g_new(gchar, message_length);
if (g_input_stream_read_all(input_stream, message, message_length, NULL, NULL) == G_IO_ERROR_NONE) {
// 处理读取到的数据
}
g_free(message);
message = NULL;
}
} else {
// 处理读取错误
break;
}
}
}
```
该函数使用 `g_input_stream_read` 函数读取一个 `gsize` 类型的整数,该整数表示接下来要读取的数据的长度。然后使用 `g_input_stream_read_all` 函数读取指定长度的数据。如果读取成功,则处理读取到的数据。如果出现读取错误,则退出循环。你可以将该函数传递给 `g_thread_new` 函数在一个新线程中运行。