Browse Source

fix #213: close when no pong

ithewei 3 years ago
parent
commit
af3179a51e

+ 2 - 0
examples/mqtt/mqtt_client_test.cpp

@@ -73,6 +73,8 @@ int main(int argc, char** argv) {
     cli.setReconnect(&reconn);
 #endif
 
+    cli.setPingInterval(10);
+
     int ssl = 0;
 #if TEST_SSL
     ssl = 1;

+ 1 - 0
examples/mqtt/mqtt_pub.c

@@ -83,6 +83,7 @@ static void on_mqtt(mqtt_client_t* cli, int type) {
 static int mqtt_publish(const char* host, int port, const char* topic, const char* payload) {
     mqtt_client_t* cli = mqtt_client_new(NULL);
     if (cli == NULL) return -1;
+    cli->keepalive = 10;
 
     // client_id
     char client_id[64];

+ 1 - 0
examples/mqtt/mqtt_sub.c

@@ -73,6 +73,7 @@ static void on_mqtt(mqtt_client_t* cli, int type) {
 static int mqtt_subscribe(const char* host, int port, const char* topic) {
     mqtt_client_t* cli = mqtt_client_new(NULL);
     if (cli == NULL) return -1;
+    cli->keepalive = 10;
 
 #if TEST_AUTH
     mqtt_client_set_auth(cli, "test", "123456");

+ 10 - 0
mqtt/mqtt_client.c

@@ -46,6 +46,12 @@ static int mqtt_send_head_with_mid(hio_t* io, int type, unsigned short mid) {
 }
 
 static void mqtt_send_ping(hio_t* io) {
+    mqtt_client_t* cli = (mqtt_client_t*)hevent_userdata(io);
+    if (++cli->ping_cnt > 3) {
+        hloge("mqtt no pong!");
+        hio_close(io);
+        return;
+    }
     mqtt_send_head(io, MQTT_TYPE_PINGREQ, 0);
 }
 
@@ -296,9 +302,13 @@ static void on_packet(hio_t* io, void* buf, int len) {
     }
         break;
     case MQTT_TYPE_PINGREQ:
+        // printf("recv ping\n");
+        // printf("send pong\n");
         mqtt_send_pong(io);
         return;
     case MQTT_TYPE_PINGRESP:
+        // printf("recv pong\n");
+        cli->ping_cnt = 0;
         return;
     case MQTT_TYPE_DISCONNECT:
         hio_close(io);

+ 5 - 0
mqtt/mqtt_client.h

@@ -29,6 +29,7 @@ struct mqtt_client_s {
     unsigned char   alloced_ssl_ctx: 1; // intern
     unsigned char   connected : 1;
     unsigned short  keepalive;
+    int             ping_cnt;
     char client_id[64];
     // will
     mqtt_message_t* will;
@@ -177,6 +178,10 @@ public:
         mqtt_client_set_auth(client, username, password);
     }
 
+    void setPingInterval(int sec) {
+        client->keepalive = sec;
+    }
+
     int lastError() {
         return mqtt_client_get_last_error(client);
     }