Вопрос о октете завершения сообщения POP3 - PullRequest
0 голосов
/ 08 июня 2010

Это из 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. Я проверил это. Может я чего-то не понимаю, поэтому и спрашиваю.

1 Ответ

2 голосов
/ 08 июня 2010

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

Если ответ:

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'.

...