Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从垃圾箱接收垃圾_C_Linux_Glib - Fatal编程技术网

C 从垃圾箱接收垃圾

C 从垃圾箱接收垃圾,c,linux,glib,C,Linux,Glib,我正在使用以下函数创建并打开GSocket,然后侦听要在GTK_输入字段中显示的UDP消息。调用open_listen_socket函数,然后我有一个超时函数,每隔一秒左右调用get_incoming_messages函数 问题是,当我启动程序时,GTK_输入字段中只显示了一堆垃圾字符,我的控制台正在重复一条错误消息Pango WARNING:Invalid UTF-8 string传递给Pango_LAYOU_set_文本 我已经能够发送UDP消息了,没有问题,但是我正在疯狂地尝试着去理解如何

我正在使用以下函数创建并打开GSocket,然后侦听要在GTK_输入字段中显示的UDP消息。调用open_listen_socket函数,然后我有一个超时函数,每隔一秒左右调用get_incoming_messages函数

问题是,当我启动程序时,GTK_输入字段中只显示了一堆垃圾字符,我的控制台正在重复一条错误消息Pango WARNING:Invalid UTF-8 string传递给Pango_LAYOU_set_文本

我已经能够发送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_传入_消息的末尾,因为没有它,即使应用程序的其余部分继续正常工作,该进程似乎仍停留在该函数中

/编辑并更新以下内容*/

好的,根据下面的建议,我的工作正常,但我遇到了一个新问题。似乎我对g_socket_receive的调用在每次迭代中都返回true,如果没有发送消息,则打印一个空行。这意味着我确实看到了我发送的消息,但是在下一次迭代中,当它们被一个空行替换时,它们会在一瞬间从GTK_条目中消失

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语句,以便在没有数据时为它提供其他操作,以防止它尝试写入空行。我不确定我是否理解,所以如果有人有解释的话,我希望有人能给我一个解释,但我又回来了!再次感谢大家

再次检查接收数据的行。。。您从哪个插座读取数据?监听插座!该套接字仅用于通过函数接受新连接

g_socket_accept返回一个新的套接字,您还必须使其成为非阻塞的,可用于读取和发送


此外,您还应该检查g_socket_receive的返回值!在这种情况下,我几乎可以打赌它会返回-1作为一个错误,但您仍然可以打印缓冲区,它可以包含任何内容。

再次检查接收数据的行。。。您从哪个插座读取数据?监听插座!该套接字仅用于通过函数接受新连接

g_socket_accept返回一个新的套接字,您还必须使其成为非阻塞的,可用于读取和发送


此外,您还应该检查g_socket_receive的返回值!在这种情况下,我几乎可以打赌它会返回-1作为一个错误,但您仍然可以打印缓冲区,它可以包含任何内容。

有几个指针供您考虑:

只要函数提供了使用GError的工具,请使用它。找出错误消息非常有帮助 检查函数的返回值,以确保它们完成了Joachim已经指出的任务 可用时使用枚举。在本例中,是GSocketProtocol。不要使用17而是使用G_SOCKET_PROTOCOL_UDP,因为如果枚举值更改,应用程序将中断 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;
}
2号航站楼:

$ nc 127.0.0.1 31337 -u
hello
world
^C

希望这有帮助

有几点需要您考虑:

只要函数提供了使用GError的工具,请使用它。找出错误消息非常有帮助 检查函数的返回值,以确保它们完成了Joachim已经指出的任务 可用时使用枚举。在本例中,是GSocketProtocol。不要使用17而是使用G_SOCKET_PROTOCOL_UDP,因为如果枚举值更改,应用程序将中断 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;
}
2号航站楼:

$ nc 127.0.0.1 31337 -u
hello
world
^C

希望这有帮助

接收到的文本,是否包含终止“\0”?也许你需要加上它?不知道你的意思。即使不发短信,我也会收到奇怪的信息。我一启动应用程序,它就开始弹出。收到的文本中是否包含终止的“\0”?也许你需要加上它?不知道你的意思。即使不发短信,我也会收到奇怪的信息。我一启动应用程序,它就开始弹出。谢谢你的澄清!我还没有找到任何关于在我的项目中使用套接字的例子或明确的信息,我从来都不需要任何实际的连接。谢谢你的澄清!我找不到任何例子
或者是关于在我的项目中使用套接字的明确信息,在我的项目中,我从来都不需要任何实际的连接。非常感谢您提供了这个详细的答案!在这和Joachim的回答之间,我认为除了不使用错误处理之外,我的主要问题是使我的套接字成为一个“侦听”套接字,然后是如何处理套接字上输入内容的打印。我会在今晚测试我的更改后,将这些答案标记为正确。再次感谢!这是我发现的第一个使用glib和sockets的工作示例代码。非常感谢。非常感谢您的详细回答!在这和Joachim的回答之间,我认为除了不使用错误处理之外,我的主要问题是使我的套接字成为一个“侦听”套接字,然后是如何处理套接字上输入内容的打印。我会在今晚测试我的更改后,将这些答案标记为正确。再次感谢!这是我发现的第一个使用glib和sockets的工作示例代码。非常感谢。