2010-06-08 42 views
0

這是來自POP3 RFC。關於POP3消息終止字節的問題

「回覆到某些命令是多線。在這些情況下,這 明確如下文所示,發送 響應和CRLF的第一行之後,任何附加的線路被髮送,各由一個終止 CRLF對當所有響應行已經發送時,發送一個 最後一行,包括一個終止字節(十進制代碼爲 046,「。」)和一個CRLF對,如果多行響應的任何一行爲 由終止字節開始,該行被「字節填充」 預先等待響應的該行的終止字節 因此,多行響應終止於5個八位字節 「CRLF.CRLF」。當檢查多線路響應時,客戶端檢查 以查看該行是否以終止八位字節開始。如果是這樣並且除了CRLF之外還有其他八位字節,則該行的第一個八位位組( 終止八位位組)被剝離。如果是這樣,如果CRLF立即 如下終止字符,然後從彈出 服務器的響應結束和遏制「.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終止的消息中。我檢查了。也許我不明白,這就是爲什麼我問。

+0

這沒有任何意義。除非是由CR,LF對引起的,否則你怎麼能有'下一行'?我認爲這個問題必須在你的讀取套接字例程中。你在檢查EAGAIN嗎? – 2010-06-08 17:49:03

+0

我不確定你的意思。這些不是實際消息中的行,明顯地,實際消息中的行被CRLF對分隔,但我給出的示例由來自服務器的不同響應組成。那麼,當然POP3 RFC表示他們被CRLF對終止,但他們不是,至少Gmail不這樣做。 – user361633 2010-06-08 18:21:15

回答

2

如果您發佈了用於讀取套接字的代碼,它將非常有幫助。但我會嘗試用這個例子來回答你問題的第二部分:

如果響應是:

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