我正在尝试设置GLib主循环源以监视UDP套接字。 但是,执行此源的回调时,将触发分段错误。使用GDB进行的调试表明,错误的指针地址已传递给回调。
GSource *SAPSocketMonitoring =
g_socket_create_source(SAPSocket, G_IO_IN | G_IO_PRI, NULL);
g_source_attach(SAPSocketMonitoring, NULL);
data_insertIncomingSAPPackets SocketMonitoringData;
SocketMonitoringData.DiscoveryLoop = SAPDiscoveryLoop;
SocketMonitoringData.Database = SDPDatabase;
SocketMonitoringData.Socket = SAPSocket;
g_source_set_callback
(
SAPSocketMonitoring,
callback_insertIncomingSAPPackets,
&SocketMonitoringData,
NULL
);
g_main_loop_run(SAPDiscoveryLoop);
我希望将指向SocketMonitoringData
的指针传递给回调函数callback_insertIncomingSAPPackets
,但这是GDB告诉我的:
Breakpoint 1, main (argc=1, argv=0x7fffffffdff8) at SAP_discovery.c:85
85 g_main_loop_run(SAPDiscoveryLoop);
(gdb) print SocketMonitoringData
$2 = {DiscoveryLoop = 0x555555766930, Socket = 0x555555767130 [GSocket],
Database = 0x555555769008}
(gdb) print &SocketMonitoringData
$3 = (data_insertIncomingSAPPackets *) 0x7fffffffdea0
(gdb) s
Removed old entries
Breakpoint 2, callback_insertIncomingSAPPackets (Data=0x555555767130) at ../../headers/lanio.c:544
544 gchar SAPPacketBuffer[SAP_PACKET_BUFFER_SIZE] = {'\0'};
(gdb) q
传递给callback_insertIncomingSAPPackets
而不是0x7fffffffdea0
的地址是0x555555767130
,它是存储在SocketMonitoringData.Socket
中的指针。
任何关于我做错事情的想法吗?
答案 0 :(得分:0)
好的,我终于找到了答案。我要在这里发布它,因为我发现GLib的文档对此不太了解:
根据this,我要附加在g_source_set_callback()
上的回调必须为GSourceFunc
类型。根据{{3}},这种类型的回调仅将指向用户数据的一个指针作为参数。
但是,我根据this使用g_socket_create_source()
创建套接字源,附加的回调必须为GSocketSourceFunc
类型。根据{{3}},类型为GSocketSourceFunc
的回调必须有3个参数...第一个是指向GSocket
的指针,这使我发疯。
我不明白为什么编译器没有触发错误……如果有人可以向我解释它,那就太好了。