我正在尝试用C / ++构建一个基本的POP3邮件客户端,但我遇到了一些问题。由于您在构建程序时必须定义缓冲区大小,但是消息可以任意大,您如何让邮件服务器将其部分发送给您?如果这不是解决问题的正确方法,那是什么?
虽然我在这里,但有人可以向我确认RFC 2822仍然是定义电子邮件布局的当前文档吗?
由于
答案 0 :(得分:3)
由于大多数电子邮件是使用TCP / IP完成的,因此如果您真的想要,您可以一次读取一个字节。底层实现将为您缓冲流。一次离网络接收大约1,400个字节。通常,我使用std::vector<char>
或std::string
作为缓冲区,一次读取一个字节,并push_back
在select()
循环中使用短暂超时读取缓冲区。< / p>
我不记得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中埋藏了许多陷阱。不过,这是一次非常好的学习经历。
答案 1 :(得分:0)
如果您正在读取套接字,则可以指定希望read的字节数。此外,您可以使用new
在运行时动态分配缓冲区。