Вы обрабатываете полученные данные как строку C - последовательность байтов, заканчивающуюся байтом 0 - что неверно.
recv
получает несколько байтов и помещает их в buffer
. Допустим, он получил 200 байтов.
Затем вы делаете strstr(buffer,eom_flag);
. strstr
не знает, что было получено 200 байт. strstr
начинается с начала буфера и продолжает поиск, пока не найдет ни один, или 0 байт. Есть вероятность, что он может найти в других 824 байтах буфера, даже если вы его не получили.
Тогда вы делаете output += buffer;
. Это также обрабатывает буфер, как если бы он заканчивался байтом 0. Это позволит просмотреть весь буфер (не только первые 200 байтов), чтобы найти 0 байт. Затем он добавит все до этого момента в output
. Опять же, он может найти 0 байтов в последних 824 байтах буфера и добавить слишком много данных. Возможно, он вообще не найдет 0 байт в буфере, а затем продолжит добавлять дополнительные данные из других переменных, которые хранятся рядом с buffer
в памяти. Или он может найти 0 байтов в первых 200 байтах и остановиться на этом (но только если вы отправили 0 байтов).
Что вам следует сделать, это обратить внимание на количество полученных байтов (iResult
) и добавьте столько байтов к выводу. Вы можете использовать:
output.insert(output.end(), buffer, buffer+iResult);
Также (как отметил Филипп Томасиньи в комментарии), "" может быть получено не сразу. Вы можете получить "" отдельно. Вам следует проверить, есть ли у output
"", вместо того, чтобы проверять, есть ли у buffer
"". (Последствия этого для исполнения оставлены читателю в качестве упражнения)
Кстати, эта строка в настоящий момент ничего не делает:
output.erase(std::find(output.begin(), output.end(), '\0'), output.end());
, потому что '\ 0 'никогда не добавляется к output
, потому что с output += buffer;
,' \ 0 'указывает, где прекратить добавление.