所以我在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...*/
}我一直在阅读手册页,但没有点击。指针现在有点让我摸不着头脑,我想更好地理解它们。先谢谢你救了我的命。
发布于 2019-03-02 02:17:08
htonl函数返回uint32_t类型的值。它不是一个指针,所以将它转换为一个指针是没有意义的。这就是警告告诉你的。
您需要将结果存储在temp变量中,然后将temp的地址传递给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);顺便说一句,您可以对数据结构执行适当的编组/解组,而不是试图获取结构的地址来发送/接收它。
https://stackoverflow.com/questions/54950150
复制相似问题