【问题标题】:C binary message over amqpamqp 上的 C 二进制消息
【发布时间】:2019-11-16 15:22:04
【问题描述】:

目前我有一个守护进程使用recvfrom 系统调用监听端口 X 上的 TCP/UDP 数据包:

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
             struct sockaddr *src_addr, socklen_t *addrlen);

然后使用msgsnd系统调用通过消息队列发送数据:

int msgsnd(int msqid, struct msgbuf *msgp, int msgsz, int msgflg);

我想用 RabbitMQ 替换 msgsnd 系统调用,并使用 amqp 协议发送消息。我面临的问题是通过 RabbitMQ 接收和发送的数据格式。当我在端口上接收数据时,我尝试像这样发送它:

ssize_t recvfrom(
    sockfd, msgbufInst.msgContent, len, flags, src_addr, addrlen
);
send_over_rabbitmq(msgbufInst.msgContent);

send_over_rabbitmq 在哪里

send_over_rabbitmq(char *rawData){
    amqp_bytes_t payload;
    payload.len = sizeof(rawData);
    payload.bytes = rawData;

    int result = amqp_basic_publish((*channel)->conn, 1, 
                 amqp_cstring_bytes("myExchange"),
                 amqp_cstring_bytes(""), 0, 0, NULL, payload);
}

有效载荷发送和接收成功,但丢失了一些数据。当我使用队列中的消息时,有效负载与我使用系统调用发送/使用消息时不同。我确信这与我正在使用但还无法弄清楚的数据类型有关。

【问题讨论】:

  • sizeof(rawData) 可能是 8,也可能只有 4 — 它是指针变量的大小,而不是它指向的数据的长度。那可能不是你想要的。您需要向send_over_rabbitmq() 函数发送更多信息——最明显的是从recvfrom() 接收到的数据长度。这意味着捕获信息——无论如何,您应该检查来自recvfrom() 的返回值。

标签: c binary operating-system rabbitmq message-queue


【解决方案1】:

正如我在comment 中指出的:

send_over_rabbitmq() 函数中,sizeof(rawData) 的值可能是 8,也可能只有 4 — 它是指针变量的大小,而不是它指向的数据的长度。这可能不是你想要的。

您需要向send_over_rabbitmq() 函数发送更多信息——最明显的是从recvfrom() 接收到的数据的长度。这意味着捕获信息——在尝试通过 RabbitMQ 中继信息之前,您应该检查来自 recvfrom() 的返回值。

【讨论】:

  • 你是对的。当我使用来自 rabbitmqadmin 的消息时,我可以看到所有消息都是 8 个字节。你认为我可能遗漏了其他东西。
  • 这是缺少的主要项目。我没有立即看到任何其他会造成麻烦的东西,但是我没有编写任何 RabbitMQ 代码,所以我不熟悉 amqp_bytes_t 结构或 amqp_basic_publish() 函数,因此不知道是否有非结构中的其他字段或函数的零和空参数有明显的细微差别。
  • 我认为这是唯一的问题。即使 lib 将其转换为 base64,我也能够发送数据。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多