gpt4 book ai didi

c - 从 GSocket 接收垃圾

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:13 25 4
gpt4 key购买 nike

我正在使用以下函数创建和打开 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 语句,让它在没有数据时做些别的事情,以防止它尝试写入空行。不确定我是否理解这一点,所以如果有人有解释,我会喜欢的,但我又回来了!再次感谢大家!

最佳答案

有几点供您考虑:

  1. 只要函数提供了使用 GError 的便利,请使用它。找出错误信息非常有帮助
  2. 检查函数的返回值以确保它们完成了预期的工作(Joachim 已指出)
  3. 在可用时使用枚举。在这种情况下 GSocketProtocol。不要使用 17,而是使用 G_SOCKET_PROTOCOL_UDP,因为如果枚举值更改,您的应用程序将中断
  4. UDP 套接字并不真正“监听”所以 g_socket_listen 调用是多余的

请根据您发布的内容找到以下示例代码:

/* gcc -Wall -Wextra `pkg-config --cflags --libs glib-2.0 gio-2.0` gsock.c -o gsock */

#include <glib.h>
#include <gio/gio.h>
#include <stdio.h>

#define MAX_RECV 10
#define TIMEOUT_INTERVAL 1

static GSocket *listenSocket;
static GMainLoop *loop;
static gboolean
recv_msg(gpointer data)
{
(void)data;
static unsigned int count = 0;
gchar buffer[1024] ={0};
GError *err = NULL;

if( g_socket_receive(listenSocket, (gchar *)buffer, 1024, NULL, &err) > 0 )
{
printf("buff = %s\n", buffer);
}
else
{
printf(" Nothing posted in last %d sec (Error: %s)\n", TIMEOUT_INTERVAL, err->message);
g_error_free(err);
}

if(count++ < MAX_RECV)
return TRUE;

/* This is fugly!! :\ */
g_main_loop_quit(loop);
return FALSE;
}

static int
open_listen_socket(void)
{

GInetAddress *localAddress;
GSocketAddress *localSocketAddress;
GError *err = NULL; /* This is mandatory */

localAddress = g_inet_address_new_from_string("127.0.0.1");
guint16 listenPort = 31337; /* Can you recongnize this port? xD*/
localSocketAddress = g_inet_socket_address_new(localAddress, listenPort);
listenSocket = g_socket_new(G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM, G_SOCKET_PROTOCOL_UDP, &err);
if( NULL == listenSocket)
{
printf("\n Failed to create socket! Error: %s\n", err->message);
g_error_free(err);
return -1;
}

if( FALSE == g_socket_bind (listenSocket, localSocketAddress, FALSE, &err))
{
printf("\n Failed to bind! Error: %s\n", err->message);
g_error_free(err);
return -1;
}
g_socket_set_blocking(listenSocket, FALSE);
/* UDP socket don't "listen". Uncomment below to see the error message*/
/*
if(FALSE == g_socket_listen (listenSocket, &err))
{
printf("\n Failed to listen! Error: %s\n", err->message);
g_error_free(err);
}
*/
return 0;
}

int main(void)
{
g_type_init();
if(open_listen_socket() < 0)
{
printf("\n Socket creation went wrong!!\n");
}
else
{
loop = g_main_loop_new (NULL, TRUE);
g_timeout_add_seconds(TIMEOUT_INTERVAL, recv_msg, NULL);
g_main_loop_run(loop);
}
return 0;
}

sample 运行:
1 号航站楼:

$ ./gsock 
Nothing posted in last 1 sec (Error: Error receiving data: Resource temporarily unavailable)
Nothing posted in last 1 sec (Error: Error receiving data: Resource temporarily unavailable)
Nothing posted in last 1 sec (Error: Error receiving data: Resource temporarily unavailable)
Nothing posted in last 1 sec (Error: Error receiving data: Resource temporarily unavailable)
Nothing posted in last 1 sec (Error: Error receiving data: Resource temporarily unavailable)
Nothing posted in last 1 sec (Error: Error receiving data: Resource temporarily unavailable)
buff = hello

buff = world

Nothing posted in last 1 sec (Error: Error receiving data: Resource temporarily unavailable)
Nothing posted in last 1 sec (Error: Error receiving data: Resource temporarily unavailable)
Nothing posted in last 1 sec (Error: Error receiving data: Resource temporarily unavailable)

2 号航站楼:

$ nc 127.0.0.1 31337 -u
hello
world
^C

希望这对您有所帮助!

关于c - 从 GSocket 接收垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9306125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com