我想在C/++中構建一個基本的POP3郵件客戶端,但我遇到了一些問題。既然你必須在構建程序時定義緩衝區的大小,但是消息可以是任意大的,你怎麼讓郵件服務器把它發送給你呢?如果這不是解決問題的正確手段,那是什麼?緩衝區大小在c + +套接字連接
雖然我在這裏,任何人都可以證實RFC 2822仍然是定義電子郵件佈局的當前文檔嗎?
感謝
我想在C/++中構建一個基本的POP3郵件客戶端,但我遇到了一些問題。既然你必須在構建程序時定義緩衝區的大小,但是消息可以是任意大的,你怎麼讓郵件服務器把它發送給你呢?如果這不是解決問題的正確手段,那是什麼?緩衝區大小在c + +套接字連接
雖然我在這裏,任何人都可以證實RFC 2822仍然是定義電子郵件佈局的當前文檔嗎?
感謝
由於大多數電子郵件都是使用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中。儘管如此,這是一個非常好的學習體驗。
謝謝你,這太棒了。 我根本沒有真正的計劃使用客戶端,我只是想了解事情是如何工作的。我發現這些日子裏,像Gmail一樣放任POP的實現,甚至專業建立的客戶都崩潰了,所以我不會相信我的,只要我可以拋出它。 – wyatt 2010-05-10 23:35:12
如果你是從一個socket讀取,你可以指定要read的字節數。另外,您可以使用new
在運行時動態分配緩衝區。
你是什麼意思定義緩衝區大小?你的意思是套接字緩衝區的郵件緩衝區還有其他未定義的緩衝區。 – 2010-05-10 23:06:04