我有一条通过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));
还是有其他/更好的方法吗?
答案 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可以是不同的等等。
如果希望对结构进行不同的重复,或者数据结构很复杂(如结构树),则应使用序列化。