C двоичное сообщение через amqp - PullRequest
1 голос
/ 06 июля 2019

В настоящее время у меня есть демон, прослушивающий пакеты TCP / UDP на порту X с помощью системного вызова recvfrom:

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);

Я бы хотел заменить системный вызов msgsnd на RabbitMQ и отправить сообщения по протоколу 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);
}

Полезные данные отправлены и получены успешно, но некоторые данные потеряны. Когда я получаю сообщение из очереди, полезная нагрузка не такая, как при использовании системного вызова для отправки / получения сообщений. Я уверен, что это связано с типами данных, которые я использую, но пока не могу понять.

1 Ответ

1 голос
/ 06 июля 2019

Как я заметил в комментарии :

В функции send_over_rabbitmq() значение sizeof(rawData), вероятно, равно 8, а может быть только 4 - это размер указателяпеременная, а не длина данных, на которые она указывает.Вероятно, это не то, что вам нужно.

Вам нужно будет отправить больше информации в функцию send_over_rabbitmq() - что особенно заметно - длина данных, полученных из recvfrom().Это означает сбор информации - вы должны проверить возвращаемое значение из recvfrom(), прежде чем пытаться передать информацию через RabbitMQ.

...