Пропуск строк для записи

Я создал клиент и сервер для передачи файлов. Собственно, клиент должен загружать файл с сервера. С файлами относительно небольшого размера (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;
}

Собственно, проблема возникает в разных проявлениях, а бывает и вовсе не возникает с файлами относительно больших размеров. В каких-то случаях файл отправляется полностью, без ошибок и функционирует. Бывает, что отправляется также полностью до байта, но выходит ошибка отсутствия точки входа. Однако самая частая ошибка в том, что со стороны клиента функция записи в файл пропускает строки для записи, в чем я удостоверился.


Ответы (0 шт):