客户端与 mqtt 代理断开连接后释放端口
Posted
技术标签:
【中文标题】客户端与 mqtt 代理断开连接后释放端口【英文标题】:Freeing a port after client disconnects with mqtt broker 【发布时间】:2015-12-23 00:07:09 【问题描述】:我正在使用 apollo 代理和 mosquitto C 客户端库。成功发布消息后,我使用 mosquitto_disconnect(mosq) 函数断开客户端。但看起来客户端用来连接代理的端口仍然不是空闲的。有什么办法可以手动释放客户端在c程序中用来连接broker的端口?
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= %s\n",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 = %s\n",mosquitto_strerror(err));
return -1;
mosquitto_loop_forever(mosq,-1,1);
return 10;
【问题讨论】:
【参考方案1】:这应该会自动发生,一旦 libmosquitto 认为它已经发送了 DISCONNECT 数据包,它就会关闭套接字。
您是否调用过 mosquitto_loop_forever() 或 mosquitto_loop_start() 来处理网络流量?
你使用的是什么版本的 libmosquitto?
会不会是经纪人在您不知情的情况下拒绝了您的凭据?尝试添加日志回调以查看发生了什么。
void on_log(struct mosquitto *mosq, void *userdata, int level, const char *msg)
printf("%s\n", msg);
并使用
mosquitto_log_callback_set(mosq, on_log);
我很想说你也需要回归基础。查看 clean_session 并保留 mosquitto_new 和 mosquitto_publish 的参数——它们不应该是设置为“true”的char *
字符串。阅读文档,看看有哪些工具可供您进行调试(例如 on_log),然后出去做一些调试。也许查看源代码,看看你会发生什么。
【讨论】:
我使用 mosquitto_loop_forever() 和 libmosquitto 版本 1.4.2 实际上它与您在我之前的问题中指示使用的代码相同,但无论如何添加代码以上是关于客户端与 mqtt 代理断开连接后释放端口的主要内容,如果未能解决你的问题,请参考以下文章
关于QSocket的释放的一个需要注意的情况(必须先断开连接)