c - 在 C 中使用 msgpack 接收流

标签 c msgpack messagepack

我正在实现一个从客户端接收字节流的服务器。
流使用 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 实现吗?

最佳答案

我解决了,我所要做的就是:

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 脚本)

关于c - 在 C 中使用 msgpack 接收流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42533364/

相关文章:

用 C 语言为 IRC 机器人创建一个基本 shell,并在后台运行另一个线程

c++ - 为什么 MobileSubstrate 在 hook C++ 函数时使用这么长的函数名?

c - 在C中使用数组时出错

c - 与 ">"比较时,while 循环条件从不评估为真

c++ - msgpack:将类打包到成员函数中

c++ - 使用 MsgPack 通过 ZeroMQ (zmqpp) 发送数据给出 'msgpack::v1::insufficient_bytes' 错误

ruby - 在 Redis 中存储 MessagePacked 哈希

go - 解析 msgpack 编码单个 slice 的 msgpack 编码 slice 时为空 slice

angular - 由于升级到 Angular 9 Signalr 不起作用

python - 如何在 Haskell 中使用 Data.MessagePack