Skip to content

📋 ZeroMQ Socket Monitor Events 十进制对照表

事件宏定义 十六进制值 十进制值 说明
ZMQ_EVENT_CONNECTED 0x0001 1 成功建立出站连接(TCP 连接完成)
ZMQ_EVENT_CONNECT_DELAYED 0x0002 2 连接被延迟(例如无可用 I/O 线程)
ZMQ_EVENT_CONNECT_RETRIED 0x0004 4 连接失败后重试(含重试间隔)
ZMQ_EVENT_LISTENING 0x0008 8 成功绑定并开始监听(bind() 成功)
ZMQ_EVENT_BIND_FAILED 0x0010 16 绑定失败(如端口被占用)
ZMQ_EVENT_ACCEPTED 0x0020 32 接受入站连接(TCP accept 成功)
ZMQ_EVENT_ACCEPT_FAILED 0x0040 64 接受连接失败(如资源不足)
ZMQ_EVENT_CLOSED 0x0080 128 套接字成功关闭
ZMQ_EVENT_CLOSE_FAILED 0x0100 256 套接字关闭失败
ZMQ_EVENT_DISCONNECTED 0x0200 512 连接断开(对端关闭或网络中断)
ZMQ_EVENT_MONITOR_STOPPED 0x0400 1024 监控被停止(调用 zmq_socket_monitor(..., NULL, ...)
ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL 0x0800 2048 握手失败,无详细原因(通常为系统级错误,event_value = errno
ZMQ_EVENT_HANDSHAKE_SUCCEEDED 0x1000 4096 ZMTP 握手成功(含认证成功)
ZMQ_EVENT_HANDSHAKE_FAILED_PROTOCOL 0x2000 8192 协议错误(event_value = ZMQ_PROTOCOL_ERROR_*
ZMQ_EVENT_HANDSHAKE_FAILED_AUTH 0x4000 16384 认证失败(event_value = ZAP 状态码,如 300/400/500)
ZMQ_EVENT_ALL 0xFFFF 65535 所有事件的掩码(用于启用全部监控)

🔐 协议错误子类型(用于 ZMQ_EVENT_HANDSHAKE_FAILED_PROTOCOLevent_value

这些值在事件类型为 8192 时,作为 event_value 出现:

错误宏定义 十六进制值 十进制值 说明
ZMQ_PROTOCOL_ERROR_ZMTP_UNSPECIFIED 0x10000000 268435456 未指定的 ZMTP 错误
ZMQ_PROTOCOL_ERROR_ZMTP_UNEXPECTED_COMMAND 0x10000001 268435457 收到意外的 ZMTP 命令
ZMQ_PROTOCOL_ERROR_ZMTP_INVALID_SEQUENCE 0x10000002 268435458 ZMTP 命令序列无效
ZMQ_PROTOCOL_ERROR_ZMTP_KEY_EXCHANGE 0x10000003 268435459 密钥交换失败(CURVE)
ZMQ_PROTOCOL_ERROR_ZMTP_MALFORMED_COMMAND_HELLO 0x10000013 268435475 HELLO 命令格式错误
ZMQ_PROTOCOL_ERROR_ZMTP_MALFORMED_COMMAND_INITIATE 0x10000014 268435476 INITIATE 命令格式错误
ZMQ_PROTOCOL_ERROR_ZMTP_MECHANISM_MISMATCH 0x11000002 285212674 安全机制不匹配(如一端用 CURVE,另一端未启用)
ZMQ_PROTOCOL_ERROR_ZMTP_CRYPTOGRAPHIC 0x11000001 285212673 加密操作失败(如密钥无效)
ZMQ_PROTOCOL_ERROR_ZAP_UNSPECIFIED 0x20000000 536870912 ZAP(认证代理)未指定错误
ZMQ_PROTOCOL_ERROR_ZAP_MALFORMED_REPLY 0x20000001 536870913 ZAP 回复格式错误
ZMQ_PROTOCOL_ERROR_ZAP_BAD_VERSION 0x20000003 536870915 ZAP 版本不支持

💡 提示:ZMQ_PROTOCOL_ERROR_* 的十进制值较大(≥ 2.6 亿),可通过位运算或查表识别。


🧪 使用示例(C++ 日志解析)

cpp
void handle_monitor_event(uint16_t event, const char* addr) {
    static const std::unordered_map<uint16_t, std::string> event_names = {
        {1, "CONNECTED"},
        {2, "CONNECT_DELAYED"},
        {4, "CONNECT_RETRIED"},
        {8, "LISTENING"},
        {16, "BIND_FAILED"},
        {32, "ACCEPTED"},
        {64, "ACCEPT_FAILED"},
        {128, "CLOSED"},
        {256, "CLOSE_FAILED"},
        {512, "DISCONNECTED"},
        {1024, "MONITOR_STOPPED"},
        {2048, "HANDSHAKE_FAILED_NO_DETAIL"},
        {4096, "HANDSHAKE_SUCCEEDED"},
        {8192, "HANDSHAKE_FAILED_PROTOCOL"},
        {16384, "HANDSHAKE_FAILED_AUTH"}
    };

    auto it = event_names.find(event);
    std::string name = (it != event_names.end()) ? it->second : "UNKNOWN";
    LOG_DEBUG << "Monitor event: " << event << " (" << name << ") at " << addr;
}

📌 注意事项

  • 所有事件值均为 位掩码(bitmask),可组合使用(如 ZMQ_EVENT_CONNECTED | ZMQ_EVENT_DISCONNECTED)。
  • event_value 字段在不同事件中有不同含义:
    • HANDSHAKE_FAILED_NO_DETAILerrno
    • HANDSHAKE_FAILED_PROTOCOLZMQ_PROTOCOL_ERROR_*
    • HANDSHAKE_FAILED_AUTH → ZAP 状态码(300=临时拒绝,400=无效请求,500=内部错误)
  • ZMQ_EVENT_ALL = 65535 是前 16 个事件的全集(0xFFFF)。

此表可直接用于日志分析、监控工具开发或故障排查。建议收藏!

基于 VitePress 构建