C / C ++从char缓冲区读取以填充结构

时间:2012-10-14 02:59:49

标签: c++ c sockets struct scanf

我有一条通过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 [] I调用缓冲区。有人建议,不要只是将整个缓冲区转换为RPCMessage,最好是从缓冲区逐个读取每个参数,然后将第一个参数作为正确的枚举类型并使用ntohl彼此争论。最好的方法就是:

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));

还是有其他/更好的方法吗?

2 个答案:

答案 0 :(得分:0)

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

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

这取决于您的消息的复杂程度。

答案 1 :(得分:0)

我建议你去结构。主要原因 - 表现。

您几乎总能在结构布局和缓冲区中的数据之间实现二进制兼容性。有一些pragma控制填充和对齐等。在C ++中有特殊的对齐规范。

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

如果希望对结构进行不同的重复,或者数据结构很复杂(如结构树),则应使用序列化。