Получение потока с помощью msgpack в C

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

У меня вопрос, как правильно получить этот поток в C?
В Python я могу сделать это следующим образом:

# Feed each byte into the Unpacker
unpacker.feed(client.recv(1))
# Unpack whatever we can from the bytes we have received
for value in unpacker:
    print(value)

Есть ли способ, которым я могу сделать это в C?

1 ответ

Решение

Я решил это, все, что мне нужно было сделать, это следующее:

msgpack_unpacker tUnpacker = { 0 };
BOOL bUnpacked = FALSE;
unsigned char abReceivedBytes[1] = { 0 };
msgpack_unpacked tUnpacked = { 0 };
msgpack_unpack_return eUnpackRet = MSGPACK_UNPACK_PARSE_ERROR;

while (FALSE == bUnpacked)
{
    // Read here from socket
    ...

    /* Check buffer capacity and reserve more buffer if needed */
    if (msgpack_unpacker_buffer_capacity(&tUnpacker) < nNumOfBytes)
    {
        bResult = msgpack_unpacker_reserve_buffer(&tUnpacker, nNumOfBytes);
        if (FALSE == bResult)
        {
            // Handle error
        }
    }

    /* feeds the buffer. */
    memcpy(msgpack_unpacker_buffer(&tUnpacker), &abReceivedBytes[0], nNumOfBytes);
    msgpack_unpacker_buffer_consumed(&tUnpacker, nNumOfBytes);

    /* initialize the unpacked message structure */
    msgpack_unpacked_init(&tUnpacked);
    eUnpackRet = msgpack_unpacker_next(&tUnpacker, &tUnpacked);
    switch (eUnpackRet) {
    case MSGPACK_UNPACK_SUCCESS:
        /* Extract msgpack_object and use it. */
        bUnpacked = TRUE;
        break;
    case MSGPACK_UNPACK_CONTINUE:
        break;
    default:
        // Handle failure
        ...
    }

Вот как вы можете читать поток, используя msgpack (это почти эквивалентно скрипту python в моем вопросе)

Другие вопросы по тегам