📋 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_PROTOCOL 的 event_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_DETAIL→errnoHANDSHAKE_FAILED_PROTOCOL→ZMQ_PROTOCOL_ERROR_*HANDSHAKE_FAILED_AUTH→ ZAP 状态码(300=临时拒绝,400=无效请求,500=内部错误)
ZMQ_EVENT_ALL = 65535是前 16 个事件的全集(0xFFFF)。
此表可直接用于日志分析、监控工具开发或故障排查。建议收藏!