【发布时间】: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