Обычно, когда вы создаете собственный протокол поверх TCP / IP, вы используете простой формат сообщения, где первые 4 байта представляют собой целое число без знака, содержащее длину сообщения, а остальные - данные сообщения. Если у вас есть такой протокол, то цикл приема такой же простой, как показано ниже (не уверен, что такое нотация ASIO, так что это просто идея)
for(;;) {
uint_32_t len = 0u;
read(socket, &len, 4); // may need multiple reads in non-blocking mode
len = ntohl(len);
assert (len < my_max_len);
char* buf = new char[len];
read(socket, buf, len); // may need multiple reads in non-blocking mode
...
}