You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于libuv与AMQP-CPP的C++连接RabbitMQ报错求助

问题分析:RabbitMQ连接报错{bad_header}

我想通过libuv和AMQP-CPP在C++里给RabbitMQ发送消息,Windows环境下AMQP-CPP的TCP通信似乎存在问题,因此自己编写了如下代码:

static void alloc_cb(uv_handle_t* handle, size_t size, uv_buf_t* buf) {
  *buf = uv_buf_init((char *)malloc(size), size);
}

void on_close(uv_handle_t* handle)
{
  printf("closed.");
}


void on_write(uv_write_t* req, int status)
{
  if (status) {
    perror("uv_write error ");
    return;
  }
  printf("wrote.\n");
  free(req);
  //uv_close((uv_handle_t*)req->handle, on_close);
}

void on_read(uv_stream_t* tcp, ssize_t nread, const uv_buf_t* buf)
{
  printf("on_read. %p\n", tcp);
  if (nread >= 0) {
    //printf("read: %s\n", tcp->data);
    printf("read: %s\n", buf->base);
  }
  else {
    //we got an EOF
    uv_close((uv_handle_t*)tcp, on_close);
  }

  //cargo-culted
  free(buf->base);
}

void write2(uv_stream_t* stream, char* data, int len2) {
  uv_buf_t buffer[1];
  buffer[0].base = data;
  buffer[0].len = len2;
  uv_write_t* req = (uv_write_t*)malloc(sizeof(uv_write_t));
  uv_write(req, stream, buffer, 1, on_write);
}


void on_connect(uv_connect_t* connection, int status)
{
  if (status < 0) {
    printf("failed to connect\n"); return;
  }
  printf("connected. %p %d\n", connection, status);

  uv_stream_t* stream = connection->handle;
  free(connection);
  write2(stream, (char*)"test!", 10);
  uv_read_start(stream, alloc_cb, on_read);
}

int main() {
  uv_loop_t* loop = uv_default_loop();

  uv_tcp_t* pSock = (uv_tcp_t*)malloc(sizeof(uv_tcp_t));
  uv_tcp_init(loop, pSock);
  uv_tcp_keepalive(pSock, 1, 60);

  struct sockaddr_in dest;
  uv_ip4_addr("10.10.50.242", 5672, &dest);

  uv_connect_t* pConn = (uv_connect_t *)malloc(sizeof(uv_connect_t));
  printf("allocated %p\n", pConn);

  uv_tcp_connect(pConn, pSock, (const struct sockaddr*)&dest, on_connect);

  uv_run(loop, UV_RUN_DEFAULT);
}

运行后,RabbitMQ日志中出现如下错误:

2023-02-28 15:49:10.901000+09:00 [info] <0.17112.1> accepting AMQP connection <0.17112.1> (ipaddr:51509 -> ipaddr:5672)
2023-02-28 15:49:10.901000+09:00 [error] <0.17112.1> closing AMQP connection <0.17112.1> (ipaddr:51509 -> ipaddr:5672):
2023-02-28 15:49:10.901000+09:00 [error] <0.17112.1> {bad_header,<<116,101,115,116,33,0,0,0>>}

错误原因分析

  • 你直接发送了字符串"test!",但RabbitMQ遵循AMQP协议,连接建立后第一步必须发送符合AMQP规范的协议头,而非任意文本。
  • 日志里的{bad_header,<<116,101,115,116,33,0,0,0>>}是将你发送的内容转成了ASCII码:116对应t、101对应e、115对应s、116对应t、33对应!,后面的0是因为你指定了长度10,超出"test!"(5个字符)的部分是内存中的随机0值,这完全不符合AMQP的协议头要求。
  • AMQP协议头有固定格式,比如AMQP 0-9-1的协议头是AMQP\x00\x00\x09\x01,必须先发送这个正确的协议头,RabbitMQ才会认可连接,之后才能进行认证、声明队列、发送消息等操作。
  • 手动编写TCP通信对接RabbitMQ需要实现AMQP协议的所有细节,对新手来说难度极高。建议还是使用AMQP-CPP库处理协议层,仅将libuv作为它的事件循环后端,而非从零实现TCP通信。

内容的提问来源于stack exchange,提问作者beginner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 12:59:13