Получите закрытое двоичное сообщение в sscanf - PullRequest
0 голосов
/ 09 ноября 2018

Я отправляю сообщение, подобное этому:

char buffer[175];
sprintf(buffer, "MD: %4ld %2d %10s %5s %7.2f %5d\n"
    , id
    , position
    , *(MktDepthOperation::ENUMS) operation
    , *(MktDeptSide::ENUMS)side
    , price
    , size);

PrintProcessId, printf(buffer);
SolSendMessage("testhello", buffer);
...

void SolSendMessage(const char* topic, const char *text_p)
{
    ...
    if (s_canSend) {
            if ((rc = solClient_session_sendMsg(session_p, msg_p)) != SOLCLIENT_OK) {
...
}

С другой стороны, я просто отправляю сообщение. Как мне отсканировать поля обратно из двоичного буфера, который кодирует закрытый формат утешения? Я пытаюсь избежать google protocol buffers и использую рекомендуемый Solace proprietary format.

solClient_rxMsgCallback_returnCode_t
messageReceiveCallback ( solClient_opaqueSession_pt opaqueSession_p, solClient_opaqueMsg_pt msg_p, void *user_p )
{
    //printf ( "Received message:\n" );
    solClient_msg_dump ( msg_p, NULL, 0 );
    printf ( "\n" );

    msgCount++;

    return SOLCLIENT_CALLBACK_OK;
}

1 Ответ

0 голосов
/ 09 ноября 2018

Из вашего фрагмента кода не ясно, как устанавливается буфер для сообщения. Чтобы просто отправить и получить строку в двоичном вложении сообщения с помощью API Solace, вы можете использовать solClient_msg_setBinaryAttachment при отправке и solClient_msg_getBinaryAttachment для получения строки при получении. Не рекомендуется проверять выходные данные solClient_msg_dump, так как это будет включать дополнительную информацию о заголовках сообщения. Эта утилита дампа сообщений предоставляется в качестве вспомогательного средства программирования для облегчения разработки и тестирования приложений обмена сообщениями, а не для непосредственного извлечения данных в сообщении.

Другой вариант - использовать структурированный тип данных Solace. Solace SDT - это структурированные, независимые от языка и архитектурно-независимые типы данных. Они могут использоваться в сообщениях для облегчения обмена двоичными данными в гетерогенной сети, в которой есть клиенты, использующие различные аппаратные архитектуры и языки программирования. Если вы отправляете фиксированную структуру данных, вы можете использовать «createBinaryAttachmentStream» для создания потока структурированных данных.

например. Если у вас есть фиксированная структура данных, например:

struct MD {
        long id;
        int position;
        char operation[10];
        char side[5];
        float price;
        int size);
    }

Вы можете создать поток структурированных данных, а затем вызвать addInt64/addInt32/addString/addString/addFloat/addInt для каждого из членов. На принимающей стороне вы можете извлечь члены dataStructure, вызвав getInt64/getInt32 и т. Д. В противном случае, если вы не используете известную структуру данных, вы можете использовать карту вместо потока и присвоить каждому полю соответствующее имя.

Дополнительная информация о типах структурированных данных Solace доступна здесь: https://docs.solace.com/Solace-PubSub-Messaging-APIs/Developer-Guide/SDT-Containers.htm

...