Пропуск строк для записи
Я создал клиент и сервер для передачи файлов. Собственно, клиент должен загружать файл с сервера. С файлами относительно небольшого размера (15-20 КБ) загружаются и записываются без проблем. Однако, какой-нибудь исполняемый файл размером в 15 МБ загружается очень криво.
Представляю код со стороны клиента.
Функция приёма байт
void recieve(char _fname[])
{
U_CHAR _fwrite[1025];
int bytes = 0;
int b = 0;
bool _firstw = 0;
while(true)
{
bytes = recv(Connection, (char*)_fwrite, 1025, NULL);
if(bytes <= 0) break;
if(_firstw == 0)
{
_writef(_fname, _fwrite, bytes-1, "wb");
_firstw = 1;
}
else _writef(_fname, _fwrite, bytes-1, "ab");
b = bytes + b;
printf("recieved == %d ", b);
printf("wroten == %d\n", in);
}
}
Функция записи байт в файл
void _writef(char * _fname, U_CHAR _finfo[], int _flen, char * h)
{
FILE * fp = fopen(_fname, h);
//printf("_flen == %d\n", _flen);
if(fp)
{
for(int i = 0; i <= _flen ; i++)
{
putc(_finfo[i], fp);
in++;
}
fclose(fp);
}
}
Теперь код со стороны сервера Debian
Отправка файла
void _sd(char msg[])
{
int t = 0;
int b = 0;
while(true)
{
t = _readf1024(msg, _finfo);
sendfile(_finfo, _flen);
b++;
if(t == EOF) break;
}
//b = b*1024+_flen;
printf("lenght = %d\n", b);
_offset = 0;
}
Чтение файла по 1025 байт
int _readf1024(char * _fname, int _finfo[])
{
int c;
//printf("_offset == %d\n", _offset);
FILE * fp= fopen(_fname, "rb");
fseek(fp, _offset, SEEK_CUR);
if(fp)
{
int i;
for(i = 0; i <= 1024; i++)
{
c = getc(fp);
if(c == EOF){_flen = i; return EOF;}
_finfo[i] = c;
_offset++;
}
_flen = i;
//printf("_flen == %d\n", _flen);
fclose(fp);
return 0;
}
return 1;
}
Отправка записанный байт в массив на клиент
void sendfile(int _finfo[], int _flen)
{
int t = 0;
U_CHAR _fsend[1024];
for(int i = 0; i <= _flen; i++)
{
_fsend[t] = _finfo[i];
if(_flen == 0) break;
if(t == 1024 || i == _flen && _flen <= 1024 && t <= 1024)
{
_fsend[t+1] = 0x1;
//printf("i = %d\n", i);
send(Connection, (char *)_fsend, t+1, 0);
t = 0;
}
else{t++;}
}
return;
}
Собственно, проблема возникает в разных проявлениях, а бывает и вовсе не возникает с файлами относительно больших размеров. В каких-то случаях файл отправляется полностью, без ошибок и функционирует. Бывает, что отправляется также полностью до байта, но выходит ошибка отсутствия точки входа. Однако самая частая ошибка в том, что со стороны клиента функция записи в файл пропускает строки для записи, в чем я удостоверился.