Вопрос об октете завершения сообщения POP3

Это из POP3 RFC.

"Ответы на определенные команды являются многострочными. В этих случаях, которые четко указаны ниже, после отправки первой строки ответа и CRLF отправляются любые дополнительные строки, каждая из которых завершается парой CRLF. Когда все строки ответа отправлены, отправляется последняя строка, состоящая из октета завершения (десятичный код 046, ".") и пары CRLF. Если какая-либо строка многострочного ответа начинается с октета завершения, строка "заполняется байтами" путем добавления октета завершения к этой строке ответа. Следовательно, многострочный ответ завершается пятью октетами "CRLF.CRLF". При проверке многострочного ответа клиент проверяет проверьте, начинается ли строка с октета завершения. Если да и если за ним следуют октеты, отличные от CRLF, то первый октет строки (октет завершения) удаляется. Если да и если CRLF следует сразу за символом завершения, то ответ от сервер POP закончился и Строка, содержащая ".CRLF", не считается частью многострочного ответа."

Ну, у меня есть проблема с этим, например, gmail иногда отправляет октет завершения, а затем в СЛЕДУЮЩЕЙ ЛИНИИ отправляет пару CRLF. Например:

"+OK blah blah\r\n"
"blah blah.\r\n"
"\r\n"

Это очень редко, но иногда это случается, поэтому, очевидно, я не могу определить конец сообщения в таком случае, потому что я ожидаю строку, состоящую из '.\r\n'. Серьезно, Gmail нарушает протокол POP3 или я что-то не так делаю? Также у меня есть второй вопрос, английский не мой родной язык, поэтому я не могу полностью его понять:

"Если какая-либо строка многострочного ответа начинается с октета завершения, строка "заполняется байтами" путем добавления октета завершения к этой строке ответа. Таким образом, многострочный ответ завершается с помощью пять октетов "CRLF.CRLF"."

Когда именно используется CRLF.CRLF? Может ли кто-нибудь дать мне простой пример? В rfc сказано, что это используется, когда любая строка ответа начинается с октета завершения. Но я не вижу строк, начинающихся с '.' в сообщениях, которые завершаются с помощью CRLF.CRLF. Я это проверил. Может я чего-то не понимаю, поэтому и спрашиваю.


person user361633    schedule 08.06.2010    source источник
comment
Это бессмысленно. Как у вас может быть «следующая строка», если она не вызвана парой CR, LF? Я думаю, что проблема должна быть в вашей процедуре чтения сокетов. Вы проверяете EAGAIN?   -  person Amardeep AC9MF    schedule 08.06.2010
comment
Я не уверен, что вы имеете в виду. Это не строки в фактическом сообщении, очевидно, что строки в фактическом сообщении заканчиваются парой CRLF, но пример, который я привел, состоит из разных ответов от сервера. Ну, конечно, в RFC для POP3 сказано, что они завершаются парой CRLF, но это не так, по крайней мере, Gmail этого не делает.   -  person user361633    schedule 08.06.2010


Ответы (1)


Было бы очень полезно, если бы вы разместили код, который вы используете для чтения сокета. Но я попытаюсь ответить на вторую часть вашего вопроса на этом примере:

Если ответ:

hello world\r\n
we are doing fine\r\n
.500 is same as one-half\r\n
this is the last line\r\n

сервер должен отправить его как:

hello world\r\n
we are doing fine\r\n
..500 is same as one-half\r\n
this is the last line\r\n
.\r\n

Таким образом, вы можете видеть, где он «байт набил» лишний «.». поэтому «.500» можно различить как часть ответа. Также последними пятью октетами являются '\r\n.\r\n'.

person Amardeep AC9MF    schedule 08.06.2010