Почему в буфер не попадает полное сообщение? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Даже не знаю,хватит ли у кого желания проковырять этот исходник Программа по изучению работы с сокетами. При подключении к серверу программа читает сообщение почты,но по какой-то причине в буфер попадает не всё сообщение,и притом то,что находится в буфере,может состоять из начала сообщения и его конца/середины. Размер буфера вроде позволяет принять сообщение полностью
#define MAX_DATA_SIZE       1048571    /* Default maximal allowed message size*/
#define MSG_SEGMENT_SIZE    32768
Сервер сообщает о размере сообщения в 41842 октета (я так понимаю,это числа по 8 бит каждое?) Получение пакета от сервера происходит в функции receive_srv_answer в файле netlib.c (пакет принимается в буфер блоками с максимальным размером MSG_SEGMENT_SIZE),а на печать его содержимое выводится функцией print_srv_answer в файле frontend.c. В чём может быть загвоздка,почему данные в буфере неполные и перемешиваются? Просто не возьму в толк, как так можно ошибиться, и главное, никаких вылетов нет,это странно. Если кто-то захочет глянуть,помочь - я облегчил задачу,как мог - нужно просто скомпилить и запустить в консоли бинарник.Прога работает в автоматическом режиме. Не уверен,будет ли это компилиться на винде,но заголовки я указал на всякий случай. Исходный текст,ожидаемый в буфере находится в файле expected-message Исходник прикрепляю в надежде ))

Решение задачи: «Почему в буфер не попадает полное сообщение?»

textual
Листинг программы
   while (bytes_received < bufsize) {

Объяснение кода листинга программы

  1. Вход в цикл while.
  2. Проверка условия bytes_received < bufsize.
  3. Если условие истинно, то происходит переход к следующему шагу.
  4. Если условие ложно, то происходит выход из цикла. Внутри цикла:
  5. Передача данных из файла в буфер:
    • Приемник данных (переменная buffer) получает значение из файла.
    • Значение переменной bytes_received увеличивается на единицу.
    • Если значение переменной bytes_received становится равным bufsize, то происходит выход из цикла.
  6. Вывод сообщения об успешном получении данных:
    • Вывод сообщения об успешном получении данных (переменная message).
    • Если значение переменной bytes_received становится равным bufsize, то происходит выход из цикла.
  7. Увеличение указателя на буфер на единицу:
    • Увеличение указателя на буфер на единицу (переменная buffer).
    • Если значение переменной bytes_received становится равным bufsize, то происходит выход из цикла.
  8. Увеличение значения переменной bytes_received на единицу:
    • Увеличение значения переменной bytes_received на единицу.
    • Если значение переменной bytes_received становится равным bufsize, то происходит выход из цикла.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы