singlepost

Программирование Сокетов, Com, Lpt, USB портов на СИ << На главную или назад  

Суть - две программы - одна передает файл, другая принимает через сокеты,Com, Lpt, USB порты. USB не сделал еще, не могу найти информацию про них.

В чем проблема - при передаче определенных файлов через сокеты, функция fread заканчивает чтение файла не дойдя до конца файла ( на 89 кбайте). Такое случается не на всех файлах, и я не пойму в чем дело.

Вот тут http://slil.ru/26523213 проекты Visual Studio 2005. А тут http://slil.ru/26523227 только исходники.В папке FileTransfer находятся тестовые файлы для передачи, все файлы кроме test1.txt передаются правильно.

И если кто-то может протестировать на соединении через Com или Lpt, пожалуйста напишите. И если кто-то значет что-то про USB - тоже :-)

Помогите отловить баг, пожалуйста.

17 ответов в теме “Программирование Сокетов, Com, Lpt, USB портов на СИ”

Страницы: [1] 2 »

  1. 1
    Жека Кирпичев ответил:

    do {
    n_read = fread(&content,sizeof(char), sizeof(content), f);
    act_size = n_read;
    WriteFile(hPort,&act_size,sizeof(act_size),&dw,&ov);
    WriteFile(hPort,content,sizeof(content),&dw,&ov);
    }
    while (n_read == sizeof(content));

    Это неправильно. fread не обязан возвращать столько байтов сколько ты просишь, он в принципе может тебе хоть по одному байту файл отдавать, даже если ты просишь блоками по 64к. Указываемый размер – это твое "пожелание" системе.

    Условие завершения должно быть другое – n_read == 0 или feof(f) || ferror(f).

  2. 2
    Алексей Руденко ответил:

    не, если возвращает меньше, то цикл прекращается. Дело в том, что возвращает меньше, когда еще несколько байт файла осталось – и не во всех файлах

  3. 3
    Жека Кирпичев ответил:

    Вот я и говорю, что оно *может* возвращать меньше, даже когда еще осталось содержимое в файле, *поэтому* проверять конец файла надо не по n_read == sizeof(content), а по n_read == 0.

  4. 4
    Жека Кирпичев ответил:

    Хм. Хотя нет, вроде не может… Ну, в общем, попробуй все-таки использовать feof/ferror – может, и заработает.

  5. 5
    Алексей Руденко ответил:

    MSDN – fread returns the number of full items actually read, which may be less than count if an error occurs or if the end of the file is encountered before reaching count.
    То есть происходит ошибка или файл закончился, но файл не закончился. Ошибки не должно быть. В других случаях функция не должна возвращать меньше.
    Я попробовал while (!(feof(f) || ferror(f))); – тот же эффект, сейчас попробую на ноль

  6. 6
    Алексей Руденко ответил:

    нет, не работает и при проверке на ноль, чувствую я где-то жестко туплю

  7. 7
    Жека Кирпичев ответил:

    А как ты определяешь, что оказываются прочитаны не все байты файла? Самый надежный способ – просуммировать возвращенные fread'ом значения.

  8. 8
    Алексей Руденко ответил:

    всё я нашел его :-) нужно открывать файлы с атрибутом на бинарное чтение ("rb" and "wb"), а то будет на любом нуле прекращаться. Вообще забыл про это. Спасибо, а то еще б долго мучился.

  9. 9
    Алексей Руденко ответил:

    Жека jkff Кирпичев, а у тебя нет случайно COM или LPT кабеля?

  10. 10
    Жека Кирпичев ответил:

    Увы, нету.

Страницы: [1] 2 »

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.