gpt4 book ai didi

C - 使用 htonl 和 ntohl 编码/取消编码结构

转载 作者:行者123 更新时间:2023-12-04 14:20:57 27 4
gpt4 key购买 nike

所以我在 c 中有一个结构,我需要通过 UDP 套接字发送它。 RPCmessage 应该被扁平化为字节数组,即 message.data。然后通过 UDP 套接字发送 message.data。

typedef struct {
enum {Request, Reply} messageType; /* same size as an unsigned int */
unsigned int RPCId; /* unique identifier */
unsigned int procedureId; /* e.g.(1,2,3,4) for (+, -, *, /) */
int arg1; /* argument/return parameter */
int arg2; /* argument/return parameter */
/* each int (and unsigned int)is 4
bytes */
} RPCmessage;

typedef struct {
unsigned int length;
unsigned char data[SIZE];
} Message;

我对 c 语言还很不熟练,所以我不确定如何将其扁平化为字节数组以通过套接字发送。我相信我需要使用 htonl() 来编码,并使用 ntohl() 来解码。但是我无法让我的 memcpy 表现出我需要的样子。目前我收到警告:从不同大小的整数转换为指针 [-Wint-to-pointer-cast]

void marshal(RPCmessage *rm, Message *message){
memcpy(&message->data[0], (char *)htonl(rm->messageType), sizeof(rm->messageType));
memcpy(&message->data[4], (char *)htonl(rm->RPCId), sizeof(rm->RPCId));

/* more marshaling follows for the other 4 members */
}

希望它很简单?但是当这个问题解决后,我确信我会遇到将字节数组解码回 RPCmessage 结构的问题。我的猜测是做这样的事情......但是我不知道如何使用 ntohl 将它恢复为主机顺序。

void unMarshal(RPCmessage *rm, Message *message){
//here, I am assuming *message is the message received from the socket
memcpy(rm->messageType, message->data[0], sizeof(rm->messageType));
memcpy(rm->RPCId, message->data[4], sizeof(rm->RPCId));

/*more unmarshaling...*/

}

我一直在阅读手册页,但没有点击。指针目前有点让我头疼,并试图更好地理解它们。预先感谢您挽救了我的生命。

最佳答案

htonl 函数返回类型为 uint32_t 的值。它不是指针,因此将其强制转换为 one 没有意义。这就是警告告诉您的内容。

您需要将结果存储在临时变量中,然后将临时地址传递给memcpy:

uint32_t msgType = htonl(rm->messageType);
uint32_t rpcId = htonl(rm->RPCId);
memcpy(&message->data[0], &msgType, sizeof msgType);
memcpy(&message->data[4], &rpcId, sizeof rpcId);

顺便说一句,对你的数据结构执行正确的编码/解码而不是试图获取结构的地址来发送/接收它的荣誉。

关于C - 使用 htonl 和 ntohl 编码/取消编码结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54950150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com