試圖實作一個基于mosquitto MQTT代理的異步客戶端,在后臺永遠運行。我的目的是創建一個能夠連接/重新連接到經紀商的客戶端,以防經紀商在某些時候脫機。我希望所有的連接/重新連接邏輯都由mosquitto的回呼管理(事件驅動)。然而,如果你在經紀商停止(離線)的初始時間嘗試運行客戶端,這段代碼并沒有嘗試連接到經紀商:
經過一些測驗,替換為 通過一個 while 回圈輪詢 mosquitto_connect_async 函式回傳的第一個成功資訊: 在 while 回圈之后,似乎所有的源代碼都可以基于 mosquitto 的回呼。
這是否是管理這種情況的預期方式?還是應該以不同的方式來管理?謝謝!
uj5u.com熱心網友回復: 你不需要進行多次連接嘗試。你的問題是,第一次嘗試由于同樣的原因而失敗,但還沒有觸發任何回呼,因為通信執行緒還沒有啟動。
如果你檢查 如果
標籤: 上一篇:mytrader-股票期貨金融軟體+支持C/C++/Python/Excel/VBA/麥語言的量化分析交易平臺 下一篇:我怎樣才能反復做一個異步函式?
構建mosquitto回呼(事件驅動)。
struct mosquitto *broker;
char ip[INET_ADDRSTRLEN]; // broker ip 地址
int port; // 1883
int keepalive; // 60
bool running = true;
int main(void)
{
mosquitto_lib_init()。
broker = mosquitto_new(NULL, true, NULL)。
mosquitto_connect_callback_set(broker,on_connect_callback)。
mosquitto_disconnect_callback_set(broker, on_disconnect_callback)。
mosquitto_message_callback_set(broker, on_message_callback)。
mosquitto_connect_async(broker, ip, port, keepalive)。
mosquitto_loop_start(broker)。
while(running) {
pause();
}
}
mosquitto_connect_async(broker, ip, port, keepalive)。
bool connected()
bool connected_to_broker = false;
while (!connected_to_broker) {
rc = mosquitto_connect_async(broker, ip, port, keepalive)。
如果(rc == MOSQ_ERR_SUCCESS) {
connected_to_broker = true;
} else {
sleep(retry_timeout);
}
}
mosquitto_connect_async的回傳值,你會看到它是MOSQ_ERR_ERRNO,errno被設定為ECONNREFUSED(111)。
mosquitto_loop_start在你的第一次連接嘗試之前被呼叫,斷開連接的回呼應該被觸發 - 也是在rc == MOSQ_ERR_ERRNO 和 errno == ECONNREFUSED
