- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用以下函数创建和打开 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 语句,让它在没有数据时做些别的事情,以防止它尝试写入空行。不确定我是否理解这一点,所以如果有人有解释,我会喜欢的,但我又回来了!再次感谢大家!
最佳答案
有几点供您考虑:
GError
的便利,请使用它。找出错误信息非常有帮助GSocketProtocol
。不要使用 17
,而是使用 G_SOCKET_PROTOCOL_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/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!