2. Увидел в протоколе ESMTP, что может быть несколько ответов:
ehlo office.company1.tld
250-mail.company2.tld is pleased to meet you
250-DSN
250-SIZE
250-STARTTLS
250-AUTH LOGIN PLAIN CRAM-MD5 DIGEST-MD5 GSSAPI MSN NTLM
250-ETRN
250-TURN
250-ATRN
250-NO-SOLICITING
250-HELPХотя про SMTP было написано в той же Википедии, что ответ всегда 1 строка. (То есть, когда реализуешь протокол SMTP, надо дождаться приема символов 0D 0A в ответ, да?)
Telnet (стандартный, из FreeBSD) работает по схеме "ввели 1 символ - послали", да? И вообще при такой передаче, получив один символ на любой стороне, никак нельзя сказать, собирается ли вторая сторона послать за ним еще символы (считая их неразрывным по смыслу целым) или нет? Т.е. нужно ждать определенного признака, например того же 0D 0A (cr lf)?
Как же тогда можно работать по протоколу ESMTP, ведь откуда клиент знает, сколько строчек ему послал сервер?
3. Что должна делать нормальная функция приема ответа от сервера? Где можно найти ее схему. Имеется в виду надежное соединение, по TCP.
Например, есть такая книжка - Теренс Чан. Системное программирование на C++ для Unix. Так у него ничего из нижеперечисленного нету (просто вызов recv(), подразумевается, что он примет абсолютно все данные, посланные другой стороной по одному вызову send(), за один вызов recv). А я современные функции почитал - там целая куча всего.
- Вроде бы количество прочитанных байт 0 означает, что у той стороны, наконец, нет ничего, что бы она хотела нам послать. Но с другой стороны, вторая сторона вроде в любой момент может передумать и решить послать еще данные, новым вызовом send... С другой стороны походит, что возврат recv 0 прочитанных байт сродни нулю в ASCIIZ-строке, разделяющему одну строку из идущих подряд от другой. А если мы не успели дочитать первую строку “KISA1”, сервер послал уже вторую “KISA2”... То прочитав 0, мы можем подумать, что более нам ничего не посылали, в то время как там еще вторая строка? Или это неправда? Т.е. что мы прочитаем из сокета: 5 байт + “KISA1” – 0 байт – 5 байт + “KISA2” – 0 байт ? Или : 5 байт + “KISA1” – 5 байт + “KISA2” – 0 байт? Или 10 байт + “KISA1KISA2” – потом 0 байт?
- Если прочитано не 0 байт из сокета, то большинство функций чтения (не как у Чана!) читают и читают, пока не прочитают 0 байт.
- Надо как-то ловить разрывы соединения (по ошибке) и нормальное закрытие сокета второй стороной (как???? У Теренса Чана об этом ничего не сказано).
Можно ли различить на второй стороне 2 случая: а) первая сторона послала туда первым вызовом send() строку из 40 байт, вторым – еще строку из 40 байт; б) первая сторона послала все 80 байт одним вызовом send(). Я подумывал, что функция recv возвращает 0 прочитанных байт, именно чтобы дать знать, что кончились за один раз посланные данные. Т.е. например в случае с ESMTP когда очередное обращение вернет 0 прочитанных байт, значит мы дочитали все строчки этого длинного ответа сервера (см. выше про ESMTP). А то может быть, если сообщение шло частями (не гарантируется доставка мгновенно и всего сразу), то может ли быть так, что прочитается из сокета первая часть сообщения, а потом, т.к. остаток еще не пришел, то прочитается 0 байт?? Не преждевременно ли будет в таком случае считать ответ полностью полученным. И может ли такое случиться.
Все вопросы http://unixvop.narod.ru/