Мне было интересно, может ли кто-нибудь помочь мне с моей проблемой. На стороне клиента у меня есть связанный список, каждый элемент которого содержит целое число. Предположим, я добавил 5 целых чисел (скажем, 1, 2, 3, 4, 5). Я проверил, и процедура для создания и добавления целых чисел в связанный список в порядке. После этого я хочу сериализовать связанный список с помощью приведенного ниже кода:
typedef struct ser_buff_ {
void *b;
int size; // total size of the buffer
int next; // length of the contained data
}ser_buff_t;
void serialize_linkedlist(table_t *table, ser_buff_t *b){
table_entry_t *head = table->next;
while(head){
int temp = head->data;
serialize_data(b, (char*)&temp, sizeof(int));
head = head->next;
}
unsigned int sentinel = 0xFFFFFFFF;
serialize_data(b, (char*)&sentinel, sizeof(unsigned int)); // mark the tail
}
таблица ссылается на первый элемент в связанном списке, а b - буфер, в котором я хочу сериализовать связанный список. Как вы можете видеть, вызывается функция serialize_data (). Функция выглядит следующим образом:
void serialize_data(ser_buff_t *b, char *data, int nbytes){
if(b == NULL) assert(0);
ser_buff_t *buff = b;
int available_size = buff->size - buff->next;
int isResize = 0;
while(available_size < nbytes){
buff->size *= 2;
available_size = buff->size - buff->next;
isResize = 1;
}
if(isResize == 0){
memcpy((char*)buff->b + buff->next, data, nbytes);
buff->next += nbytes;
return;
}
buff->b = realloc(buff->b , buff->size);
memcpy((char*)buff->b + buff->next, data, nbytes);
buff->next += nbytes;
return;
}
После сериализации связанного списка я отправляю буфер на сервер с помощью следующего кода:
ret = write(data_socket, b, b->next);
Здесь, на стороне сервера, я получить сериализованный буфер через сокет.
ret = read(data_socket, b, 128);
Я уверен, что b->next
на стороне клиента меньше 128. После получения сериализованных данных от клиента сервер передает их функции десериализации:
void de_serialize_linkedlist(ser_buff_t *b, table_t *table){
int i = 1;
unsigned int sentinel = 0;
while(i){
de_serialize_data((char*)&sentinel, b, sizeof(unsigned int));
if(sentinel == 0xFFFFFFFF){
break;
}
else{
serialize_buffer_skip(b, sizeof(unsigned int)* (-1));
de_serialize_data((char*)&i, b, sizeof(int));
add(table, i);
}
}
}
внутри этой функции есть еще одна функция de_serialize_data (), которая вызывается:
void de_serialize_data(char *dest, ser_buff_t *b, int nbytes){
if(!b || !b->b) assert(0);
if(!nbytes) return;
if((b->size - b->next) < nbytes) assert(0);
memcpy((char*)dest, (char*)b->b + b->next, nbytes);
b->next += nbytes;
}
Но я получил сбой при достижении линии
memcpy((char*)dest, (char*)b->b + b->next, nbytes);
Я предполагаю, что b->b
не доступно, что не является моим ожиданием. Может ли кто-нибудь, пожалуйста, помогите мне.