Я использую следующие функции для создания и открытия GSocket, а затем прослушиваю сообщения UDP для отображения в поле GTK_ENTRY. Вызывается функция open_listen_socket, а затем по истечении времени ожидания у меня есть функция, вызывающая функцию get_incoming_messages каждую секунду или около того.
Проблема в том, что при запуске программы в поле GTK_ENTRY появляется только куча мусорных символов, и моя консоль повторяет сообщение об ошибке "Pango-WARNING: неверная строка UTF-8 передана в pango_layout_set_text ( ). "
Мне удалось без проблем отправлять UDP-сообщения, но я схожу с ума, пытаясь понять, как их получить, даже если кажется, что это не должно быть так сложно!
Спасибо за любую помощь, вот мои функции:
static void open_listen_socket()
{
GInetAddress *localAddress;
GSocketAddress *localSocketAddress;
localAddress = g_inet_address_new_from_string("127.0.0.1");
guint16 listenPort = atoi(gtk_entry_get_text (GTK_ENTRY (listenPortField)));
localSocketAddress = g_inet_socket_address_new(localAddress, listenPort);
listenSocket = g_socket_new(G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, 17, NULL);
g_socket_bind (listenSocket, localSocketAddress, FALSE, NULL);
g_socket_set_blocking(listenSocket, FALSE);
g_socket_listen (listenSocket, NULL);
}
static int get_incoming_message()
{
gchar buffer[1024];
int input_length;
input_length = g_socket_receive(listenSocket, (gchar *)buffer, 1024, NULL, NULL);
gtk_entry_set_text (GTK_ENTRY (current_status_message_box), (const gchar *)buffer);
return 1;
}
Кроме того, если это вообще поможет, мне пришлось добавить «return 1;» в конце get_incoming_message, потому что без него этот процесс, похоже, застрял внутри этой функции, хотя остальная часть приложения продолжала работать нормально.
/ РЕДАКТИРОВАТЬ И ОБНОВИТЬ НИЖЕ * /
Хорошо, используя приведенный ниже совет, у меня все работает, но я сталкиваюсь с новой проблемой. Похоже, что мой вызов g_socket_receive возвращает true при каждой итерации, печатая пустую строку, если сообщение не было отправлено. Это означает, что я вижу, что мои отправленные сообщения приходят через, но они исчезают из GTK_ENTRY через доли секунды, поскольку они заменяются пустой строкой на следующей итерации.
static gboolean get_incoming_message()
{
gchar buffer[10] = {0};
GError *err = NULL;
if (g_socket_receive(listenSocket, (gchar *)buffer, 10, NULL, &err) > 0 );
{
printf("\n%s", buffer);
gtk_entry_set_text (GTK_ENTRY (current_status_message_box), (const gchar *)buffer);
return TRUE;
}
return FALSE;
}
Я не знаю, какие проверки использовать, чтобы определить разницу между реальным сообщением и этими пустыми строками! Это похоже на то, как если бы этот сокет получал бесконечный поток пустых данных каждый раз, когда законное сообщение не отправлялось. Имеет ли это смысл?
/ Разобрался! /
Мне пришлось добавить инструкцию ELSE, чтобы дать ему что-то еще, когда не было данных, чтобы он не пытался написать пустую строку. Не уверен, что я это понимаю, поэтому я хотел бы получить объяснение, если у кого-то есть такое, но я снова в деле! Еще раз спасибо всем!