请求/回复服务器中的paho.mqtt.c消息丢失

时间:2019-07-02 22:54:48

标签: c pthreads mqtt mosquitto paho

我正在测试一个简单的MQTT客户机-服务器模型,其中客户机反复向服务器发送请求并等待对每个请求的答复。流程是这样的:

  • 客户端以QoS 1订阅主题“服务器/客户端”
  • 服务器使用Qos 1订阅主题“客户端/服务器”
  • 客户端向服务器发送1000条消息,在传递消息时,客户端将其messagesOut计数器增加1。
  • 服务器收到新消息并调用注册的回调。在回调中,服务器向“服务器/客户端”发送一条简单消息。邮件传递后,服务器将增加其messagesOut计数器。
  • 在发送到主题“服务器/客户端”的新消息时,客户端会将其messageIn计数器增加1。
  • 当客户端的messageIn和服务器的messageOut为1000时,服务器和客户端都将停止。

在QoS级别1下,我希望服务器完全接收从客户端发送的1000条消息,并发送回1000条回复。但是,当服务器接收并发送了大约200-300条消息时,我的程序总是停滞不前。当我注释掉对MQTTAsync_sendMessage()的呼叫时,服务器可以接收全部1000条消息。我怀疑某种竞争状况或线程限制导致了这种情况,但我不太确定。

服务器中新消息的回调如下:

#define TOPIC_IN   "client/server"
#define TOPIC_OUT  "server/client"
#define PAYLOAD    "hello client\n"

unsigned long long messagesIn = 0, messagesOut = 0;

int on_message_arrival (void *context, char *topic_name, 
                        int topic_length, MQTTAsync_message *message) {
    if (!strcmp(topic_name, TOPIC_IN)) {
        MQTTAsync_freeMessage(&message);
        MQTTAsync_free(topic_name);

        messagesIn++;

        MQTTAsync_message pub_message = MQTTAsync_message_initializer;
        MQTTAsync_responseOptions opts = MQTTAsync_responseOptions_initializer;

        pub_message.payload = PAYLOAD;
        pub_message.payloadlen = strlen(PAYLOAD);
        pub_message.qos = QOS1;
        pub_message.retained = 0;
        delivered_token = 0;

        opts.context = &message;

        MQTTAsync_sendMessage((MQTTAsync)context, TOPIC_OUT, &pub_message, &opts);
    } else {
        MQTTAsync_freeMessage(&message);
        MQTTAsync_free(topic_name);
    }
    return 1;
}

任何帮助我进行调试的指南都将受到赞赏。非常感谢你!

0 个答案:

没有答案