Некорректная работа с памятью
Возникла трабла непонятного происхождения при работе с памятью.
Есть следующий код:
char* buff = dataBuffer->ptr + dataBuffer->size;
if ((rcv_size = recv(recvSocket, buff, pack_lng, 0)) > 0){
dataBuffer->size += rcv_size;
}
}
dataBuffer - структура, которая описывает буфер определенного размера, куда сваливаются все данные, полученные с сокета,
buff- указатель на хвост буфера
В цикле получаем данные с сокета и дописываем их в конец буфера.
Данные нормально приняты и записаны в буфер.
После получения данные из буфера пишутся в файл.
Возникла необходимость выкидывать первые четыре байта из каждой порции данных,
полученной с сокета. Первое и пока единственное, что пришло на ум:
while (...){
char* buff = dataBuffer->ptr + dataBuffer->size;
if ((rcv_size = recv(recvSocket, tmp_buff, pack_lng, 0)) > 0){
memmove(buff,&tmp_buff[4],rcv_size-4);
dataBuffer->size += rcv_size-4;
}
}
Создаем временный буфер tmp_buff и записываем данные в него,
затем перемещаем(или копируем) данные из него в основной буфер со смещением
в четыре байта.
В этом случае у нас происходят странности: при нескольких сеансах передачи
итоговые фаилы имеют различный размер, причем их размер варьируется кратно четырем:
отличаются по размерам на 4, 8, 16 ... байт. При том что они должны быть одинаковы
:confused::confused::confused:
Буду очень признателен за помощь
Ну, затрите их сверху сдвигом на 4 байта вашего buff.
И вы неправильно используете memmove, похоже перепутали указатели куда-откуда копируем.
Сейчас вы копируете в buff из tmp_buff (с 4 элемента)
memmove - copy memory area
SYNOPSIS
#include <string.h>
void *memmove(void *dest, const void *src, size_t n);
Ну, затрите их сверху сдвигом на 4 байта вашего buff.
И вы неправильно используете memmove, похоже перепутали указатели куда-откуда копируем.
Сейчас вы копируете в buff из tmp_buff (с 4 элемента)
Мне как раз и нужно копировать из tmp_buff в buff
Я получаю порцию данных с сокета в tmp_buff, убираю заголовок в 4 байта
и дописываю "отчищенные" данные в конец буфера buff, где они хранятся непрерывным куском
Наверняка, вариант, реализованный мной - не единственный. Может быть кто-нибудь подскажет другие способы?
Я получаю порцию данных с сокета в tmp_buff, убираю заголовок в 4 байта
и дописываю "отчищенные" данные в конец буфера buff, где они хранятся непрерывным куском
Да точно... невнимательно посмотрел на recv.
Ну все равно непонятна логика. Вы чего ождиаете?
У вас каждый раз recv честно отнимается по 4 байта,
таких recv за сеанс получается 2, 3, 4... вот и разница набигает 4, 8, 12 байт.
По-моему что написали, то и получили :) Может все-таки, ошибка в логике?
pack_lng - это что за величина?
с диска считывается файл по куску в 1400 байт. К этому куску добавляется
заголовок в 4 байта и вот эти вот 1404 байта я получаю у себя. Потом я отбрасываю
четырехбайтовый заголовок, а блок, записываю в буфер. И продолжаю писать
в буфер до тех пор, пока передающая сторона полностью не отправит мне файл.
После этого соединение разрывается. А из буфера данные перекидываются в файл.
В итоге исходный файл и файл, записанный мной, отличаются по размерам, не более чем
на килобайт при размере самого файла в несколько метров. И разница в размерах кратна
четырем.
При этом, если передающая сторона не добавляет заголовок, и я убираю код,
по обработке заголовков, то никаких проблем не возникает...
Что может быть - понять не могу, может дело в опциях компилятора, может еще в чем-то
Еще какие-нибудь мысли есть? даже не представляю, какую сторону копать :(
Копирование тряпок оптимизируют :D.
Смотрите код в первом посте...
Ramon, не могли бы вы предложить альтернативный вариант выполнения этой операции?
Ramon, не могли бы вы предложить альтернативный вариант выполнения этой операции?
Расскажите по подробнее, что представляет из себя протокол, какие данные по нему гоняются и самое главное, что есть эти загадочные 4 байта.