Ваша проблема в том, что когда вы используете recv с MSG_PEEK, вы даете recv полный размер вашего буфера, если там уже есть две строки, например, "HELLO \ r \ nHELLO \ r \ n", он будет читать их в ваш бафф.
ptr будет указывать на первый \ r \ n, затем вы вызываете recv с помощью (ptr - buff), который заставит recv читать только первый HELLO в buf, но, поскольку вы уже СЧИТАЕТЕ эту информацию в buff, вы обработаете два строк, но оставив \ r \ nHELLO \ r \ n в вашей очереди, потому что вы не полностью прочитали их.
В следующий раз вы загляните в него и получите информацию, которая уже обработана, что заставит вас поверить, что вы получаете повторяющиеся данные.
(Надеюсь, я написал это достаточно ясно, это очень запутанная ошибка, которую вы получили:)