这段代码将结构序列化为字符数组,我可以通过套接字发送它并反序列化回来。
如何修改此代码以使用结构数组
server_message[n].response = strdup("RESPONSE");
server_message[n].command = strdup("COMMAND");
server_message[n].data = strdup("DATA");
序列化为字符数组 -
char reply[1024];
通过套接字发送并反序列化回来?
#include <string.h>
typedef struct __attribute__((__packed__)) arch_sm
{
char* response;
char* command;
char* data;
} request_struct_sm;
size_t serialize(const request_struct_sm* arch_sm, char* buf)
{
size_t bytes = 0;
memcpy(buf + bytes, arch_sm->response, strlen(arch_sm->response) + 1);
bytes += strlen(arch_sm->response) + 1;
memcpy(buf + bytes, arch_sm->command, strlen(arch_sm->command) + 1);
bytes += strlen(arch_sm->command) + 1;
memcpy(buf + bytes, arch_sm->data, strlen(arch_sm->data) + 1);
bytes += strlen(arch_sm->data) + 1;
return bytes;
}
void deserialize_server(const char* buf, request_struct_sm* arch_sm)
{
size_t offset = 0;
arch_sm->response = strdup(buf + offset);
offset += strlen(buf + offset) + 1;
arch_sm->command = strdup(buf + offset);
offset += strlen(buf + offset) + 1;
arch_sm->data = strdup(buf + offset);
}
int main(){
request_struct_sm server_message;
request_struct_sm client_message;
server_message.response = strdup("RESPONSE");
server_message.command = strdup("COMMAND");
server_message.data = strdup("DATA");
// server_message[0].response = strdup("RESPONSE"); //Need to be able use array of structure
// server_message[0].command = strdup("COMMAND");
// server_message[0].data = strdup("DATA");
char reply[1024] = {0};
size_t bufLen = serialize(&server_message, reply);
deserialize_server(reply, &client_message);
printf("client_message.response = %s\n"
"client_message.command = %s\n"
"client_message.data = %s\n",
client_message.response, client_message.command, client_message.data);
return 0;
}
最佳答案
你基本上只有两个选择,而且两者都非常相似:
循环数组中的所有结构,序列化当前结构,发送给对等体。要知道数组的开头和结尾,要么首先发送条目数,要么使用特殊的结构结束标记。
开始与之前的方式相同,但不是逐一发送每个(序列化)结构,而是将每个(序列化)结构附加到一个非常大的数组中,该数组足够大以适合所有结构。然后发送整个数组。同样,您需要某种方式来发送长度或数据结束标记。
关于C如何将结构数组序列化为char数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32837736/