He estado programando un app para monitorear una flotilla usando MQTT. Todo iba muy bien estaba programando en ubuntu 24 LTS y Qt Creator, pero a la hora de querer probarla en windows no se conectaba al broker, esto era muy raro ya que en Linux estaba funcionando perfectamente.
Depurando encontre que mosqpp::mosquittopp::connect_async estaba retornando 15, un "Lookup error", en vez de cero que seria lo optimo, estuve googleando y no encontraba ningun caso igual, probe montones de cosas, como por ejemplo:
- Compilar diferente version de mosquitto
- Usar la distribucion binaria
- Conectar a otros brokers
- Usar la ip publica del broker directamente
- Cambiar el DNS de windows
- Cambiar la configuracion de red de Windows
Despues empece a leer el codigo fuente de mosquitto y vi que el codigo de error MOSQ_ERR_EAI (15) era retornado mucho despues de fallar una llamada a getaddrinfo() entonces decidi poner una llamada a getaddrinfo() para saber de que se trataba.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "ws2tcpip.h" | |
int main() { | |
addrinfo hints = {}, *res; | |
hints.ai_family = AF_INET; | |
int status = getaddrinfo("test.mosquitto.org", nullptr, &hints, &res); | |
if (status != 0) { | |
std::cerr << "getaddrinfo failed: " << gai_strerror(status) << std::endl; | |
} else { | |
std::cout << "getaddrinfo succeeded" << std::endl; | |
} | |
return 0; | |
} |
La invocacion de la funcion fallo pero dio un mensaje de error interesante: "Either the application has not called WSAStartup, or WSAStartup failed."
Ya con esa informacion sospeche de la solucion correcta: algo no estaba inicializado y asi era hacia falta llamar mosqpp::lib_init(), asi que agregue al inicio del programa:
mosqpp::lib_init();atexit([](){mosqpp::lib_cleanup();});