我正在开发一个非常简单的应用程序,它需要在指定的端口上侦听传入的UDP消息,然后在GTK Entry字段中显示它们。我试图从GSocket文档开始工作,但没有太多运气。
以下是我的相关功能(错误检查遗漏)。我从main调用open_listen_socket,然后启动一个每秒调用get_incoming_messages的超时。第一次调用get_incoming_messages时,应用程序崩溃并出现Segmentation故障。
我不知道我是否只是遗漏了一些愚蠢的东西,或者如果我使用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);
}
}
答案 0 :(得分:1)
不看文档,对g_socket_receive的调用看起来很虚伪。缓冲区arg为null - 与此有关的函数是什么(它可能意味着它将分配自己的缓冲区)。你确定它不是& buffer的意思吗?
<编辑>
不,它是一个char *,应该至少分配大小字节。你的是空的。这样做。
< / edit>