2012-02-15 87 views
0

我在一個非常簡單的應用程序需要偵聽指定端口傳入的UDP消息,然後在GTK輸入欄中顯示他們的工作。我正在嘗試從GSocket文檔開始工作,但沒有多少運氣。接收簡單UDP消息與GSocket

以下是我的相關功能(檢查離開了錯誤)。我叫open_listen_socket從主,然後啓動這就要求get_incoming_messages每一秒鐘左右超時。第一次調用get_incoming_messages時,應用程序崩潰並出現分段錯誤。

我不知道,如果我只是失去了一些東西愚蠢的,或者如果我在完全錯誤的軌道上我對聽力的GSocket的用法,但任何指導,將不勝感激。我已經在一個簡短的截止日期,你們這幾天一直在救我的屁股!

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); 



} 

static void get_incoming_message() 
{ 

gchar *buffer=NULL; 
gsize size=100; 

g_socket_receive(listenSocket, buffer, size, NULL, NULL); 

if (strlen(buffer) > 0) 
{ 
    gtk_entry_set_text (GTK_ENTRY (current_status_message_box), buffer); 
} 


} 

回答

1

沒有看文檔,對g_socket_receive的調用看起來是假的。緩衝區arg爲空 - 函數意味着什麼(可能意味着它將分配它自己的緩衝區)。你確定這是不是意味着要&緩衝區?

<編輯>

不,它是一個char *是應該有至少size字節分配。你的是空的。這將做到這一點。

< /編輯>

+0

好的,我改變了它周圍的 「gchar *緩衝液= g_malloc(大小);」它負責分割故障。但現在看來,在調用get_incoming_message凍結起來,而不是完全崩潰。 – DrRocket 2012-02-15 02:50:42

+0

最初的想法(再次不看文檔)是它阻止,等待其完全100個字符進來。 – John3136 2012-02-15 02:59:03

+0

我認爲做到了。再次感謝! – DrRocket 2012-02-15 03:37:43