amqp 上的 C 二进制消息

C binary message over amqp

目前我有一个守护进程使用 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);
}

有效负载发送和接收成功但部分数据丢失。当我使用队列中的消息时,有效负载与我使用系统调用 send/consume 消息时不同。我确信它与我正在使用的数据类型有关,但我还不能弄明白。

正如我在 中指出的那样:

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

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