Paho Python客户端遇到套接字读取错误以及随后与代理断开连接

时间:2014-08-27 22:41:23

标签: python ssl rabbitmq paho

客户详细信息:从http://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.python.git获取的Paho MQTT Python客户端,SHA id 300fcbdffd62d08f627f94f3074463cfa532ca87

代理详细信息:带有MQTT插件的RabbitMQ 3.3.4

在第一个场景中,所有内容都在本地运行并启用了SSL。我正在以一种方式使用客户端,我有一个单独的进程来发布消息(> 10000条消息)并且不等待发布之间的确认。该错误是self._ssl.read(1)从client.py中_packet_read的以下代码片段返回零长度值的结果:

        ...
        if self._in_packet['command'] == 0:
        try:
            if self._ssl:
                command = self._ssl.read(1)
            else:
                command = self._sock.recv(1)
        except socket.error as err:
        ...
        else:
            if len(command) == 0:
                return 1
            command = struct.unpack("!B", command)
            self._in_packet['command'] = command[0]
        ...

并在从RabbitMQ接收和解析25个确认后发生。发生此错误后,我不再收到经纪人的任何回复。

如果我在禁用SSL的情况下运行,则不会遇到任何错误,并且可以成功接收所有已发送邮件的确认。

如果我远程运行代理(互联网上的某个位置),我会通过SSL获得相同的结果。但是,当不使用SSL时,我会以不同的时间间隔获得读取错误/断开连接但客户端能够恢复/重新连接,并且我收到所有已发送消息的代理确认。

以下是我正在使用的客户端配置:

    ...
    client = Client('foo')
    client.max_inflight_messages_set(65536)
    client.on_connect = self.on_connect_callback
    client.on_disconnect = self.on_disconnect_callback
    client.on_publish = self.on_publish_callback
    client.on_message = self.on_message_callback
    client.username_pw_set('foo', 'bar')
    client.tls_set("ca-cert.pem",
                        "client-cert.pem",
                        "client-key.pem")
    client.will_set(topic="last_will/foo",
                         payload=Message().body, qos=1)
    client.connect('127.0.0.1', 8883, 30)
    client.loop_start()
    ...

有关可能导致此问题和/或故障排除建议的任何想法吗?

UPDATE 20140828:我正在单步执行loop_read并注意到在成功接收到第一个完整数据包(连接确认)后,我得到一个空的套接字返回值。在socket.recv调用之前调用select,表示在套接字上有数据可供读取。这可能是套接字缓冲区问题吗?我不确定Python套接字接收缓冲区(btw我在OSX上运行它)的行为是否溢出。

0 个答案:

没有答案