c语言 ipc 参数 序列化,序列化和序列化德在ANSI C

问题是我已经工作了相当一段时间,解决不了,为什么它不能正常工作,希望你能帮助我一起想办法!我会尽量保持描述性。序列化和序列化德在ANSI C

的想法是序列化的结构(NIPC分组结构),通过TCP发送到另一个进程,然后反序列化和重新建立该结构。但不知何故,我无法让它正常工作,只是偏袒。这里是结构。

typedef struct {

char pct_type;

short int payload_lenght;

}__attribute__((__packed__)) t_header;

typedef struct {

char* path;

long unsigned int size;

long int offset;

}__attribute__ ((__packed__)) t_payload_read;

typedef struct {

t_header header;

t_payload_read payload;

}__attribute__ ((__packed__)) t_pct_read;

然后,我第一序列有效载荷(偏移量,大小和路径),以计算有效负载的长度,则整个分组,包括报头将其发送。然后反序列化,但没有办法让它工作,另一方面,我得到的标题确定和路径字段“确定”,但我得到奇怪的数字上的偏移量和大小,例如,使用这个硬编码值的结构:

type: 4

offset: 5

size: 15

path: ~/Desarrollo/Workspace

我得到:

pct->header.pct_type: 4

pct->header.payload_length: 28

pct->payload.path: ~/Desarrollo/Workspac

pct->payload.size: 143994937

pct->payload.offset: 143994941

在这里,我追加了序列化和反序列化功能,我设计,我想是为描述和仔细越好。

char* serialize_read(t_pct_read* packet) {

char* buffer = malloc(

sizeof(t_header) + sizeof(packet->payload.offset)

+ sizeof(packet->payload.size)

+ strlen(packet->payload.path + 1));

char* payload = malloc(

sizeof(packet->payload.offset) + sizeof(packet->payload.size)

+ strlen(packet->payload.path) + 1);

int offset;

// First I serialize the Payload, in order to calculate It's lenght

memcpy(payload, packet->payload.path, strlen(packet->payload.path) + 1);

offset = strlen(packet->payload.path)+1;

memcpy(payload + offset, &packet->payload.size, sizeof(long unsigned int));

offset += (sizeof(long unsigned int));

memcpy(payload + offset, &packet->payload.offset, sizeof(long int));

packet->header.payload_lenght = offset+1; // Here I get payload's length

offset = 0;

// Same procedure here, but for the entire packet, including the header.

memcpy(buffer, &packet->header.pct_type, sizeof(char));

offset = sizeof(char);

memcpy(buffer + offset, &packet->header.payload_lenght, sizeof(short int));

offset += sizeof(short int);

memcpy(buffer + offset, packet->payload.path,

strlen(packet->payload.path) + 1);

offset += strlen(packet->payload.path + 1);

memcpy(buffer + offset, &packet->payload.size, sizeof(long unsigned int));

offset += (sizeof(long unsigned int));

memcpy(buffer + offset, &packet->payload.offset, sizeof(long int));

return buffer;

}

t_pct_read* deserialize_read(char* stream) {

t_pct_read* packet = malloc(sizeof(t_pct_read));

int offset;

int alloc_size;

memcpy(&packet->header.pct_type, stream, sizeof(char));

offset = sizeof(char);

memcpy(&packet->header.payload_lenght, stream + offset, sizeof(short int));

offset += sizeof(short int);

for (alloc_size = 1; (stream + offset)[alloc_size - 1] != '\0';

alloc_size++) {

packet->payload.path = malloc(alloc_size)+1;

}

memcpy(packet->payload.path, stream + offset, alloc_size+1);

offset += strlen(packet->payload.path);

memcpy(&packet->payload.size, stream + offset, sizeof(long unsigned int));

offset += (sizeof(long unsigned int));

memcpy(&packet->payload.offset, stream + offset, sizeof(long int));

return packet;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值