My point is that if you set run=1 before each call to publish(), then wait for that publish to complete before doing anything else (which is what you want), then it will work fine (assuming the broker doesn't disconnect etc).
If an earlier call to publish() can have an effect on the run variable for a subsequent publish, then you obviously didn't use a blocking publish in the first case. Another way to achieve a similar effect would be to store the mid of the blocking message, then compare it to the highest mid sent out (by using the on_publish callback). If my mid is 1 and the highest sent mid is 2, then my message has sent. You'd have to deal with mid wraparound as well of course. -- You received this bug notification because you are a member of Mosquitto Development, which is subscribed to mosquitto. https://bugs.launchpad.net/bugs/1261683 Title: synchronous/blocking mode is not really supported Status in mosquitto: an mqtt message broker: New Bug description: It seems that blocking mode is not really supported. Topology: publisher -- broker -- subscriber Publisher simply publish a message then exit. Subscriber sometimes can receive message published by publisher, but sometimes not. The root cause is, libmosquitto does not really support blocking mode. mosquitto_connect_bind --> _mosquitto_reconnect --> _mosquitto_send_connect That means mosquitto_connect_bind() does not wait until CONNACK arrives. Logs can prove that: ---- 1387273535: New connection from 172.18.111.243 on port 1883. 1387273535: New client connected from 172.18.111.243 as TestClientId (c1, k3600). 1387273535: Sending CONNACK to TestClientId (0) 1387273535: Socket error on client TestClientId, disconnecting. ---- We can see: 1) Broker has not received PUBLISH message from publisher. 2) Broker has not received DISCONNECT message from publisher. All because blocking mode is not really supported. In blocking mode, mosquitto_connect_bind should wait until CONNACK arrives; If QoS not 0, mosquitto_publish should wait unit ... mosquitto_subscribe should wait unit ... ... Here is code of the publisher: #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include "mosquitto.h" #define dbg(fmt, args...) \ printf("%s(%u): "fmt"\n", __FUNCTION__, __LINE__, ##args) int main(int argc, char *argv[]) { struct mosquitto *mosq = NULL; int rv; const char topic[] = "TestTopic"; const char buf[] = "Hello, world"; if (MOSQ_ERR_SUCCESS != mosquitto_lib_init()) { return -1; } if (NULL == (mosq = mosquitto_new("TestClientId", 1, NULL))) { dbg("mosquitto_new() failed"); rv = -1; goto quit; } rv = mosquitto_connect_bind(mosq, "172.18.111.245", 1883, 3600, "172.18.111.243"); if (MOSQ_ERR_SUCCESS != rv) { dbg("mosquitto_connect_bind() failed: %s", mosquitto_strerror(rv)); if (MOSQ_ERR_ERRNO == rv) { dbg("errno = %d: %s", errno, strerror(errno)); } rv = -1; goto quit; } if (MOSQ_ERR_SUCCESS != mosquitto_publish(mosq, NULL, topic, sizeof(buf), buf, 0, 0)) { dbg("mosquitto_publish to %s failed", topic); rv = -1; goto quit; } quit: if (NULL != mosq) { mosquitto_disconnect(mosq); mosquitto_destroy(mosq); } mosquitto_lib_cleanup(); return rv; } To manage notifications about this bug go to: https://bugs.launchpad.net/mosquitto/+bug/1261683/+subscriptions -- Mailing list: https://launchpad.net/~mosquitto-devel Post to : [email protected] Unsubscribe : https://launchpad.net/~mosquitto-devel More help : https://help.launchpad.net/ListHelp

