何も知る必要はありません。TCPはストリームプロトコルであり、いつでも1バイトから数メガバイトのデータを取得できます。TCPソケットを使用する正しい唯一の方法は、ループで読み取ることです。
char buf[4096]; // or whatever
std::deque<char> data;
for (int res ; ; )
{
res = recv(fd, buf, sizeof buf, MSG_DONTWAIT);
if (res == -1)
{
if (errno == EAGAIN || errno == EWOULDBLOCK)
{
break; // done reading
}
else
{
// error, break, die
}
}
if (res == 0)
{
// socket closed, finalise, break
}
else
{
data.insert(data.end(), buf, buf + res);
}
}
ループの唯一の目的は、ソケットバッファからアプリケーションにデータを転送することです。次に、アプリケーションは、ある種の高レベルのアプリケーションメッセージの抽出を試みるのに十分なデータがキューにあるかどうかを個別に判断する必要があります。
たとえば、あなたの場合、キューのサイズが少なくとも5であるかどうかを確認し、最初の5バイトを調べてから、キューが完全なアプリケーションメッセージを保持しているかどうかを確認します。いいえの場合は中止し、はいの場合はメッセージ全体を抽出し、キューの先頭から離れている場合はポップします。