0

我有一条通过 UDP 套接字发送的消息。消息的类型为 RPCMessage

typedef struct
{
    enum {Request, Reply} messageType;
    unsigned int RPCId;
    unsigned int procedure;
    int arg1;
    int arg2;
} RPCMessage;

当我发送准备发送消息时,我构造消息如下:

RPCMessage toSend = {RPCMessage::Reply, htonl(rpcId), htonl(procedureId), htonl(int1), htonl(int2);

当我收到消息时,它被接收到我调用缓冲区的 char[] 中。有人建议,与其将整个缓冲区转换为 RPCMessage,不如让我从缓冲区中逐个读取每个参数,然后可以将第一个参数作为正确的枚举类型并使用 ntohl on互相争论。最好的方法是这样的:

RPCMessage::messageType type;
unsigned int id, procedure;
int int1, int2;
sscanf(buffer, %d%d%d%d%d, type, id, procedure, int1, int2);
RPCMessage received = {type, ntohl(id), ntohl(procedure), ntohl(int1), ntohl(int2));

还是有另一种/更好的方法?

4

2 回答 2

0

最好的方法是使用健壮的序列化框架,如 boost 序列化。

http://www.boost.org/doc/libs/1_51_0/libs/serialization/doc/index.html

这取决于您的消息可以变得多复杂。

于 2012-10-14T03:02:48.197 回答
0

我建议转换为结构。主要原因 - 性能。

您几乎总是可以在结构布局和缓冲区中的数据之间实现二进制兼容性。有控制填充和对齐等的编译指示。在 C++ 中有特殊的对齐规范。

我不想说just cast and problems will disappear。您仍然需要处理字节顺序,字符 repr 可以不同等。

当您想要对结构有不同的表示或当您的数据结构很复杂(如结构树)时,应该使用序列化。

于 2012-10-14T03:08:55.880 回答