Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [mosquitto-dev] Possible Bug in in ping handling

Hi Graham,

I'm not quite sure how your code can produce the behaviour you are
seeing. The line:

system("mosquitto_pub -t /test -m Off");

produces a completely new client that is unrelated to the one you are
running in your code - and hence wouldn't modify the keepalive timer
for your client. If you call mosquitto_publish() at that point instead
you should hopefully not have any further problems.

Cheers,

Roger



On Sun, Feb 21, 2016 at 3:31 PM,  <mosquitto-dev.gpbenton@xxxxxxxx> wrote:
> Hi,
>
> I believe the program below demonstrates a bug in the ping handling of a
> client.  It appears that receiving a message just
> before a ping is expected results in the client sending another
> connection request.  The result is
>
> graham@graham-VirtualBox-k14:~/engMQTTClientTest$ ./clientText
> Client clientText sending CONNECT
> Client clientText received CONNACK
> Client clientText sending SUBSCRIBE (Mid: 1, Topic: /test, QoS: 2)
> Client clientText received SUBACK
>
>
> Client clientText received PUBLISH (d0, q0, r0, m0, '/test', ... (3 bytes))
> /test:Off
> Client clientText sending CONNECT
> Client clientText received CONNACK
> Client clientText sending SUBSCRIBE (Mid: 2, Topic: /test, QoS: 2)
> Client clientText received SUBACK
> Client clientText received PUBLISH (d0, q0, r0, m0, '/test', ... (3 bytes))
> /test:Off
> ^C
>
>
> Of course, I may have misinterpreted something.
>
> Regards
>
> Graham Benton
>
>
> #include <stdio.h>
> #include <string.h>
> #include <time.h>
> #include <mosquitto.h>
>
> enum fail_codes {
>     ERROR_LOG4C_INIT=1,
>     ERROR_MOSQ_NEW,
>     ERROR_MOSQ_CONNECT,
>     ERROR_MOSQ_LOOP_START,
>     ERROR_ENER_INIT_FAIL
> };
>
> int countdown = 0;
>
> void my_message_callback(struct mosquitto *mosq, void *userdata,
>                          const struct mosquitto_message *message)
> {
>     char tempString[message->payloadlen+1];
>     strncpy(tempString, message->payload, message->payloadlen);
>     tempString[message->payloadlen] = '\0';
>
>     printf("%s:%s\n", message->topic, tempString);
> }
>
>
> void my_connect_callback(struct mosquitto *mosq, void *userdata, int result)
> {
>
>     if(!result){
>         /* Subscribe to broker information topics on successful connect. */
>         mosquitto_subscribe(mosq, NULL,  "/test", 2);
>
>     }else{
>     printf("Not Connected");
>     }
> }
>
> void my_log_callback(struct mosquitto *mosq, void *userdata, int level,
>                      const char *str)
> {
>     printf("%s\n", str);
>
>     countdown = 17;
>
> }
>
> int main(int argc, char **argv){
>     struct mosquitto *mosq = NULL;
>     int err = 0;
>
>
>
>     mosquitto_lib_init();
>     mosq = mosquitto_new("clientText", true, NULL);
>     if(!mosq){
>         return ERROR_MOSQ_NEW;
>     }
>
>     mosquitto_log_callback_set(mosq, my_log_callback);
>     mosquitto_connect_callback_set(mosq, my_connect_callback);
>     mosquitto_message_callback_set(mosq, my_message_callback);
>
>     if((err = mosquitto_connect_async(mosq, "localhost", 1883, 20))
>        != MOSQ_ERR_SUCCESS){
>         return ERROR_MOSQ_CONNECT;
>     }
>
>     if ((err = mosquitto_loop_start(mosq)) != MOSQ_ERR_SUCCESS) {
>         mosquitto_disconnect(mosq);
>         mosquitto_destroy(mosq);
>         mosquitto_lib_cleanup();
>         return ERROR_MOSQ_LOOP_START;
>     }
>
>     while (1) {
>     sleep(1);
>     /* Send a message just before the ping is due */
>     if (--countdown == 0) {
>         system("mosquitto_pub -t /test -m Off");
>     }
>     }
>
> }
>
>
>
> _______________________________________________
> mosquitto-dev mailing list
> mosquitto-dev@xxxxxxxxxxx
> To change your delivery options, retrieve your password, or unsubscribe from this list, visit
> https://dev.eclipse.org/mailman/listinfo/mosquitto-dev


Back to the top