关于我的套接字程序的一个问题:我有一个内部类...我想(对不起,从Java到C/C++)是:
typedef struct {
enum {Request, Reply} messageType;
unsigned int RPCId;
unsigned int procedure;
int arg1;
int arg2;
} RPCMessage;
我希望收到RPCMessage作为对通过UDP套接字发送的请求的响应。目前,我收到包含以下代码的消息:
/* Recv a response */
fromSize = sizeof(fromAddr);
if ((respSize = recvfrom(sock, buffer, maxSize, 0, (struct sockaddr *)&fromAddr,
&fromSize)) != messageSize)
DieWithError("recvfrom() failed");
我应该注意这里的缓冲区是一个char数组。我想要的是将接收到的消息转回RPCMessage ...,所以我尝试了:
RPCMessage receivedMessage = (RPCMessage)buffer;
这并不能使编译器感到满意...将char数组中的那些字节重新排列回RPCMessage及其字段的正确方法是什么?
最佳答案
您别无选择。选项1是复制缓冲区的内容:
RPCMessage receivedMessage;
memcpy(&receivedMessage, buffer, sizeof(receivedMessage));
选项2是将指向char缓冲区的指针重新解释为指向RPCMessage类型的指针:
RPCMessage *receivedMessage = (RPCMessage *)buffer;
第3个选项是手动将缓冲区解析为
RPCMessage
类的字段。对于选项#1和#2,您必须了解结构/字段填充,体系结构的对齐要求等。