Mosquitto.h не определяет содержимое «struct mosquitto»

#mosquitto #libmosquitto

#mosquitto #libmosquitto

Вопрос:

Насколько я понял, когда клиент подключается, я должен проверить, является ли сеанс постоянным, и, если это не так, выполнить подписку на интересующие темы. Я использую Mosquitto версии 1.5.

Я не нашел способа проверить это свойство с помощью вызовов API, но обнаружил, что в нем есть clean_session логическое поле struct mosquitto . Но когда я пытаюсь получить к нему доступ таким образом:

 void my_connect_callback(struct mosquitto *mosq, void *userdata, int result)
{
    log("Connected, session persistency",(int)(mosq->clean_session));
 

Я получаю ошибку разыменования указателя на неполный тип. Это кажется нормальным, как mosquitto.h только НЕ имеет определения полей внутри struct mosquitto . Вызываемый файл mosquitto_internal.h имеет его, но, похоже, он не предназначен для включения в проект приложения.

Что здесь не так?

Обновление (после комментария @hardillb): (1) Я не нашел документации, в которой говорится, что clean_session в структуре mosquitto это то же самое, к чему я перехожу mosquitto_new ; (2) в документации здесь говорится

Сообщение CONNACK содержит две записи данных:

  • Флаг присутствия сеанса
  • Код возврата соединения

И логично, что «флаг присутствия сеанса» будет где-то в данных обратного вызова connect или в самой структуре mosquitto. Поэтому я предположил, что clean_session в структуре есть значение, возвращаемое функцией connect. Далее, в том же источнике говорится:

Флаг session present сообщает клиенту, есть ли у брокера уже постоянный сеанс, доступный из предыдущих взаимодействий с клиентом. Когда клиент подключается с чистым сеансом, для которого установлено значение true, флаг session present всегда false, поскольку сеанс недоступен. Если клиент подключается с чистым сеансом, для которого установлено значение false, есть две возможности: если информация о сеансе доступна для идентификатора клиента. и брокер сохранил информацию о сеансе, флаг session present имеет значение true.

Где этот session_present флаг — чтобы приложение знало, что текущее соединение является продолжением предыдущего, и не подписывается повторно на те же темы?

Комментарии:

1. Какую проблему вы на самом деле пытаетесь здесь решить? он mosq->clean_session всегда будет хранить значение clean_session значения, которое вы ему передали mosquitto_new , и не изменится в зависимости от любого ответа от брокера.

Ответ №1:

Глядя на исходный код, это подразумевает, что вы должны использовать mosquitto_connect_with_flags_callback_set() , а не mosquitto_connect_callback_set()

И передает указатель на функцию обратного вызова, который принимает дополнительное int поле в конце аргументов.

Поле int будет содержать флаги CONNACK (которые в основном будут равны 0 или 1)

Похоже, что этот обратный вызов отсутствует на справочной странице.

Комментарии:

1. Лучший документ здесь mosquitto.org/api/files/mosquitto-h.html