【发布时间】:2012-02-16 05:39:58
【问题描述】:
我正在使用以下函数来创建和打开 GSocket,然后侦听 UDP 消息以显示在 GTK_ENTRY 字段中。调用 open_listen_socket 函数,然后我有一个超时函数,每隔一秒左右调用一次 get_incoming_messages 函数。
问题是,当我启动程序时,我只在 GTK_ENTRY 字段中显示一堆垃圾字符,并且我的控制台重复错误消息“Pango-WARNING: Invalid UTF-8 string passing to 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 语句,以便在没有数据时给它做其他事情,以防止它尝试写入空行。不确定我是否理解这一点,所以如果有人有解释,我很想知道,但我又回来了!再次感谢大家!
【问题讨论】:
-
收到的文本,是否包含终止符
'\0'?也许你需要添加它? -
不确定你的意思。即使没有发送任何文本,我也会收到奇怪的消息。我一启动应用程序,它就会开始弹出。