Это часто достигается путем добавления к сообщениям префикса длиной в один или два байта, которые, как вы сказали, дают длину оставшихся данных. Если я вас правильно понял, вы отправляете это в виде обычного текста (то есть «5», «5»), и это может быть разбито на части. Поскольку вы не знаете длину десятичного числа, это несколько двусмысленно. Если вам абсолютно необходимо , чтобы использовать простой текст, , возможно, вы могли бы закодировать длину как 16-битное шестнадцатеричное значение, т.е.
00ff <255 байтов данных>
000a <10 байтов данных>
Таким образом, длина заголовка размера фиксируется на 4 байта и может использоваться как минимальная длина чтения при получении на сокете.
Редактировать: Возможно, я неправильно понял - если чтение значения длины не является проблемой, справьтесь с разбиениями, объединяя входящие данные в строку, байтовый буфер или что-то еще, пока его длина не станет равной значению, которое вы прочитали в начале , TCP позаботится обо всем остальном.
Примите дополнительные меры предосторожности, чтобы убедиться, что вы не можете застрять в состоянии блокирующего чтения, если клиент не отправит полное сообщение. Например, скажем, вы получили заголовок длины и запускаете цикл, который продолжает считывать блокировку вызовов recv () до тех пор, пока буфер не будет заполнен. Если злонамеренный клиент намеренно прекращает отправку данных, ваш сервер может быть заблокирован до тех пор, пока клиент не отключится или не начнет отправку.