【问题标题】:Cannot access elements of struct mosquitto at Mosquitto MQTT Broker plugin无法在 Mosquitto MQTT Broker 插件中访问 struct mosquitto 的元素
【发布时间】:2019-02-23 12:37:30
【问题描述】:

我正在为 mosquitto MQTT 代理(版本 1.5)实现一个插件,我正在努力访问我的插件实现中指向 mosquitto 客户端结构的指针的一些元素:

#include <mosquitto_plugin.h>
...
int mosquitto_auth_acl_check(void *userdata, int access, const struct mosquitto *client, const struct mosquitto_acl_msg *msg)
{
     const char *clientid = client->id;
     const char *username = client->username;
     ...
}

在编译时我检索到错误:

错误:取消引用指向不完整类型的指针 const char *clientid = client->id;

谁能给我一些关于如何访问客户数据的建议?

编辑: struct mosquitto 在 mosquitto 源代码 (mosquitto_internal.h) 中定义:

struct mosquitto {
      ...
      char *id;
      char *username;
      ...
 }

但是 mosquitto_internal.h 仅供 mosquitto 内部使用,我的插件无法访问(至少我是这么认为的......)

在 mosquitto_plugin.h(由 mosquitto 提供并包含在我的插件中)内部只有一个对 mosquitto 结构的“引用”:

struct mosquitto;

因此,只要我不访问 mosquitto 结构的任何数据,它就会成功编译,但如果我尝试访问像 id 这样的数据,它就会崩溃。

【问题讨论】:

  • mosquitto 类型此时未定义。请提供minimal reproducible example,以便我们提供适当的帮助。
  • 我相信您无法访问该结构的成员是故意的——API 的设计者不希望您访问它们,因为如果您这样做,您的代码将在他们决定时中断在将来的版本中更改该结构的内容。 (结构是在头文件中定义的,文件名中带有字符串“internal”这一事实强烈暗示您不应直接使用该文件的任何内容)

标签: c++ mqtt mosquitto


【解决方案1】:

请使用mosquitto_broker.h中提供的访问器函数,例如

const char *mosquitto_client_id(const struct mosquitto *client);

【讨论】:

    【解决方案2】:

    让我们下载源代码,在你的插件实现中包含所需的头文件并使用这个 Makefile

    NAME = mosquitto_auth_plugin_http

    MOSQUITTO = ./mosquitto-1.5.2

    INC = -I。 -I$(MOSQUITTO)/ -I$(MOSQUITTO)/lib -I$(MOSQUITTO)/src

    CFLAGS = -Wall -Werror -fPIC

    调试 = -DMQAP_DEBUG

    LIBS = -lcurl

    全部:$(NAME).so

    $(NAME).so: $(NAME).o $(CC) $(CFLAGS) $(INC) -共享 $^ -o $@ $(LIBS)

    %.o : %.c $(CC) -c $(CFLAGS) $(DEBUG) $(INC) $

    干净: rm -f *.o *.so

    【讨论】:

    • 请不要这样做,因为该结构的内容被认为是代理的内部内容,而不是您查看的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 2021-09-10
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多