我正在使用下面的函數來創建並打開一個GSocket,然後監聽UDP消息以顯示在GTK_ENTRY字段中。 open_listen_socket函數被調用,然後在每秒鐘之後,我有一個超時函數調用get_incoming_messages函數。從GSocket接收垃圾
問題是,當我啓動程序時,我只能看到一堆顯示在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;
}
而且,如果它有助於在所有,我不得不添加了「返回1;」在get_incoming_message的末尾,因爲沒有它,即使應用程序的其餘部分繼續正常工作,該進程似乎仍然卡在該函數內。
/編輯和更新下 */
OK,請用下面的建議我有事情的工作,但我創下了新的問題。看起來我對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語句,在沒有數據時給它做別的事情,以防止它試圖寫空行。不知道我明白這一點,所以如果任何人有一個解釋,我會很樂意解釋,但我已經回來了!再次感謝大家!
收到的文字是否包含終止的''\ 0''?也許你需要添加它? – 2012-02-16 06:33:53
不確定你的意思。即使沒有發送任何文本,我也會收到奇怪的消息。一旦我啓動應用程序,它就會開始彈出。 – DrRocket 2012-02-16 06:39:30