2010-05-10 116 views
1

我想在C/++中構建一個基本的POP3郵件客戶端,但我遇到了一些問題。既然你必須在構建程序時定義緩衝區的大小,但是消息可以是任意大的,你怎麼讓郵件服務器把它發送給你呢?如果這不是解決問題的正確手段,那是什麼?緩衝區大小在c + +套接字連接

雖然我在這裏,任何人都可以證實RFC 2822仍然是定義電子郵件佈局的當前文檔嗎?

感謝

+0

你是什麼意思定義緩衝區大小?你的意思是套接字緩衝區的郵件緩衝區還有其他未定義的緩衝區。 – 2010-05-10 23:06:04

回答

3

由於大多數電子郵件都是使用TCP/IP完成的,如果您真的想要,您可以一次讀取一個字節。底層實現將爲您緩衝流。它在網絡一次收到大約1,400字節。通常,我使用std::vector<char>std::string作爲緩衝區並一次讀取一個字節,使用select()循環中的緩衝區以短暫超時讀取push_back

我不記得POP是否包含最大行長度。如果是這樣,那麼你可以使用它作爲緩衝區大小,並在矢量上調用reserve()。這將最大限度地減少可能發生的內存重新分配和副本。

至於哪個標準是最近的,http://tools.ietf.org/html/rfc2822說它被http://tools.ietf.org/html/rfc5322廢棄了。我通常檢查http://tools.ietf.org/html/rfcXXXX其中XXXX是RFC編號。如果它已經過時,那麼最上面的鏈接就是最適合的RFC。

最後提到,如果沒有很好的理由,也不要爲部署構建POP客戶端。有很多陷入埋在各種RFC中。儘管如此,這是一個非常好的學習體驗。

+0

謝謝你,這太棒了。 我根本沒有真正的計劃使用客戶端,我只是想了解事情是如何工作的。我發現這些日子裏,像Gmail一樣放任POP的實現,甚至專業建立的客戶都崩潰了,所以我不會相信我的,只要我可以拋出它。 – wyatt 2010-05-10 23:35:12

0

如果你是從一個socket讀取,你可以指定要read的字節數。另外,您可以使用new在運行時動態分配緩衝區。