Сначала в этой строке:
output[bytes_recv] = '\0';
Вам нужно сначала проверить, если bytes_recv < 0
, прежде чем сделать это, потому что у вас может быть ошибка. И так, как работает ваш код в настоящее время, вы будете просто случайным образом топать какой-то случайный кусок памяти (вероятно, байт непосредственно перед буфером).
Во-вторых, тот факт, что вы обнулили свой буфер нулем, указывает на то, что вы ожидаете получить текст ASCII без встроенных нулевых символов. Никогда не думайте, что вы ошибетесь в самый неподходящий момент.
Наконец, у потоковых сокетов есть модель, которая представляет собой очень длинный кусок ленты с множеством штампованных букв. Нет никаких обещаний, что лента будет двигаться с какой-то определенной скоростью. Когда вы звоните recv
, вы говорите: «Пожалуйста, дайте мне столько писем с ленты, сколько у вас до сих пор, до такого количества». Вы можете получить столько, сколько просите, вы можете получить только 1. Никаких обещаний. Неважно, как другая сторона выплевывает биты ленты, лента проходит через чрезвычайно сложную связку передач, и вы просто не представляете, сколько букв будет проходить в любой момент времени.
Если вы заботитесь об определенных группах символов, вы должны поместить вещи в поток (на ленту), сообщая, где эти единицы начинаются и / или заканчиваются. Есть много способов сделать это. Сам Telnet использует несколько разных в разных обстоятельствах.
А на принимающей стороне вы должны искать эти маркеры и складывать последовательности символов, которые вы хотите рассматривать как единое целое, самостоятельно.
Итак, если вы хотите прочитать строку, вы должны читать, пока не получите '\ n'. Если вы пытаетесь читать 1024 байта за раз, вы должны принять во внимание, что '\ n' может оказаться в середине вашего буфера, и поэтому ваш буфер может содержать строку, которую вы хотите, и часть следующей строки. Он может даже содержать несколько строк. Единственное обещание - вы не получите больше символов, чем просили.