2010-05-10 100 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在运行时动态分配缓冲区。