1

关于我的套接字程序的一个问题:我有一个......内部类......我猜(对不起,来自 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");

我应该注意这里的缓冲区是一个字符数组。我想要的是将收到的消息转换回 RPCMessage ......所以我尝试了:

RPCMessage receivedMessage = (RPCMessage)buffer;

这不会让编译器高兴...将 char 数组中的这些字节重新排列到 RPCMessage 及其字段中的正确方法是什么?

4

2 回答 2

3

你有几个选择。选项 #1 是复制缓冲区的内容:

RPCMessage receivedMessage;
memcpy(&receivedMessage, buffer, sizeof(receivedMessage));

选项 #2 是将指向 char 缓冲区的指针重新解释为指向 RPCMessage 类型的指针:

RPCMessage *receivedMessage = (RPCMessage *)buffer;

选项 #3 是手动将缓冲区解析为 class 的字段RPCMessage

对于选项 #1 和 #2,您必须了解结构/字段填充、架构的对齐要求等。

于 2012-10-14T02:14:02.420 回答
1

首先,您正在处理原始字节,因此请使用无符号字符数组,而不是意外的符号扩展。

其次,您需要一个指针类型来引用该缓冲区:

RPCMessage* receivedMessage = (RPCMessage*)buffer;

最后确保发送方和接收方使用相同的字节打包。同样,在执行上述操作之前,请确保您收到了 RPCMessage 的所有数据。

注意:您通常最好从缓冲区中分解字节并在 RPCMessage 结构中制造接收到的数据,除非您确信双方都同意打包、字节序等。

于 2012-10-14T02:11:57.023 回答