как их реализовывать? напр. в SMTP когда принимаешь от сервера данные их может быть несколько строк! как определить, что это последняя строка, можно передавать свои данные! Или необязательно ждать от него данные если они мне не нужны! (напр. отправка письма)
если ты вызываешь recv с определенной длиной буфера, возвращаться тебе будет реальное количество прочитанных в буфер байт. Соответственно, пока не кончатся байты. (справедливо для синхронных - блокирующих сокетов). Т.к. сервер отправив респонс будет ждать действий от тебя и лишнего не пришлет (кроме скажем NOOP в случае SMTP в случае таймаута)
Приведу отрывок из одного прекрасного документа и, надеюсь, все станет ясно: Код (Text): S: DATA R: 354 Start mail input; end with <CRLF>.<CRLF> S: Blah blah blah... S: ...etc. etc. etc. S: <CRLF>.<CRLF> R: 250 OK Документ называется RFC 821 и лежит по адресу http://www.faqs.org/rfcs/rfc821.html ну и гуглится перкрасно. RTFM!
Все зависит от протокола. По каждому отдельному протоколу ищи отдельное описание. Универсального для SMTP, IRC и др. нет
Последняя строка для smtp начинается с цифры и заканчивается переводом каретки. Грош цена кодеру который не анализирует на возможные ошибки. А для SMTP можно и не ждать, но только в том случае если сервер поддерживает smtp расширение PIPELINING. Но опять же на ошибки нужно проверять в любом случае, хотя бы по той причине, что сопровождение проги выльется адом )))