C语言 在客户端与mqtt代理断开连接后释放端口



我正在使用一个apollo broker和一个mosquito to C客户机库。在成功发布消息后,我使用mosquito - to_disconnect(蚊子)函数断开了客户机的连接。但是看起来客户机用来连接代理的端口仍然没有空闲。是否有任何方法可以手动释放客户端用于在c程序中连接代理的端口?

void on_publish(struct mosquitto *mosq, void *userdata, int mid)
{
    mosquitto_disconnect(mosq);
    log_print("mqtt",1,"Inside publish callback");

}
int sendData_mqtt(char *address, char *port, char* url, char *data)
{
    struct mosquitto *mosq;
    int err; 
    char *clean_session = "true";
    char *retain_flag = "true";
    int port1= atoi(port);
    mosq = mosquitto_new("unknown", clean_session, NULL);
    mosquitto_publish_callback_set(mosq, on_publish);
    mosquitto_username_pw_set(mosq,"admin","password"); 
    err=mosquitto_connect(mosq, address,port1,60);
    if(err != 0 ){
        log_print("mqtt",1,"connect error= %sn",mosquitto_strerror(err));
        return -1;
    }
        else 
            log_print("mqtt",1,"successfully connected");
    err = mosquitto_publish(mosq, NULL, "subject", strlen(data), data, 1, retain_flag);
    sleep(5);
    if(err != 0 ) {
        log_print("mqtt",1,"Publish error = %sn",mosquitto_strerror(err));
        return -1;
        }   
    mosquitto_loop_forever(mosq,-1,1); 
    return 10;  
}

这应该是自动发生的,一旦libmosquito认为它已经发送了DISCONNECT包,它将关闭套接字。

为了处理网络流量,您是否调用了mosquito - to_loop_forever()或mosquito - to_loop_start() ?

你用的是什么版本的libmosquito ?

有没有可能是代理在您不知情的情况下拒绝了您的凭据?试着添加一个日志回调,看看发生了什么。

void on_log(struct mosquitto *mosq, void *userdata, int level, const char *msg)
{
    printf("%sn", msg);
}
使用

mosquitto_log_callback_set(mosq, on_log);

我很想说你也需要回到基本。看看clean_session和保留蚊to_new和蚊to_publish的参数——它们不应该是一个设置为"true"的char *字符串。阅读文档,看看有什么工具可以让你做调试(例如on_log),然后出去做一些调试。也许你可以浏览一下源代码,看看你会期望发生什么。

最新更新