【问题标题】:Receiving a stream with msgpack in C在 C 中使用 msgpack 接收流
【发布时间】:2017-03-01 13:42:57
【问题描述】:

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

【问题讨论】:

  • “我有什么办法可以用 C 语言做到这一点吗?” 方法什么? 您是要我们为您编写解码器吗?
  • 你可能需要一个结构,你为什么要这样做?
  • 我有一个结构,但我收到的第一件事是整个缓冲区的大小(因为我可以接收不同类型的消息)。无论如何,我要问的是如何接收和使用 msgpack 逐字节解码流(就像在 python 脚本中一样)
  • 您可以发布来自客户端的输入之一吗?使用 python 服务器你可以做print client.recv()。这将有助于我们更好地理解您的问题。

标签: c msgpack messagepack


【解决方案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 脚本)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    相关资源
    最近更新 更多