Как указано в справочной странице, MSG_TRUNC действителен только для сокетов пакетов (например, UDP), поэтому он не будет работать так, как вы хотите для вашего сокета TCP, основанного на потоке.Буквально сотни постов в stackoverflow и в других местах говорят о сохранении границ сообщений приложений в TCP (подсказка: вам нужно сделать это самостоятельно, TCP - это интерфейс потока байтов, а не), поэтому я не буду вдаваться в подробности здесьДостаточно сказать, что вам нужен механизм, чтобы знать, насколько велико «сообщение» или «пакет» приложения на стороне recv (), чтобы позволить вам делать то, что вы хотите через TCP (или вам нужно переключиться на UDP).
Для TCP, если вам нужно «истощить» сокет, чтение до тех пор, пока не останется данных, будет работать, однако, опять же, вам нужно учитывать границы сообщений, как упомянуто выше, чтобы вы не читали черезодно «сообщение» и начало переходить к следующему (опять же, самое важное, что следует помнить, это то, что TCP предоставляет интерфейс потока байтов и не обязательно сохранит вашу концепцию пакетов или сообщений уровня приложения).