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

Reply via email to