来自发布和mqtt ping C的MQTT recv

时间:2013-04-08 14:19:00

标签: c sockets recv mqtt

我遇到了这个问题,在测试程序中,我正在为MQTT开发客户端,我订阅了一个主题,之后,我等待从服务器向我的客户端发送“发布”消息。

在发布消息的良好recv之后或在recv超时之后,我将mqtt PINGREQ发送到服务器。

在A PINGREQ之后我要等待PINGRESP,然后我就像在等待PUBLISH消息的情况一样调用recv。

如果流程如下:

Client -> PINGREQ
Server -> PUBLISH
Server -> PINGRESP

比服务器发布消息丢失了。怎么解决这个?我在QOS 0上使用MQTT,在QOS这个级别解决这个问题是有意义的,或者在QOS1检查这个案例是明智的吗?

1 个答案:

答案 0 :(得分:2)

我觉得你有点困惑。当客户端和服务器之间没有任何其他网络流量通过时,使用PINGREQ / PINGRESP,以便让客户端和服务器知道连接是否丢失。

您的客户端应该跟踪与服务器的最后一次传出或传入通信的时间,如果它将超过它使用CONNECT命令设置的keepalive计时器,则发送PINGREQ。如果没有收到通信,服务器将以1.5 * keepalive断开客户端连接。客户端应该假设服务器已断开连接,如果它没有收到PINGRESP以响应其发送PINGREQ的PINGREQ。

QoS级别并不重要,您必须确保无论如何都要保持keepalive超时。

我发现听起来你正在使用阻止网络呼叫 - 如果你可以获得更大的灵活性,最好转向非阻塞。