错误的指针通过g_source_set_callback()传递给回调

时间:2019-09-07 17:19:11

标签: c glib

我正在尝试设置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中的指针。

任何关于我做错事情的想法吗?

1 个答案:

答案 0 :(得分:0)

好的,我终于找到了答案。我要在这里发布它,因为我发现GLib的文档对此不太了解:

根据this,我要附加在g_source_set_callback()上的回调必须为GSourceFunc类型。根据{{​​3}},这种类型的回调仅将指向用户数据的一个指针作为参数。

但是,我根据this使用g_socket_create_source()创建套接字源,附加的回调必须为GSocketSourceFunc类型。根据{{​​3}},类型为GSocketSourceFunc的回调必须有3个参数...第一个是指向GSocket的指针,这使我发疯。

我不明白为什么编译器没有触发错误……如果有人可以向我解释它,那就太好了。