размер буфера для сокетного соединения в с ++ - PullRequest
1 голос
/ 11 мая 2010

Я пытаюсь построить базовый почтовый клиент POP3 в C / ++, но столкнулся с небольшой проблемой. Поскольку вы должны определить размер буфера при сборке программы, но сообщение может быть сколь угодно большим, как, например, почтовый сервер отправляет его вам по частям? И если это не верное средство решения проблемы, что это такое?

А пока я здесь, может ли кто-нибудь подтвердить для меня, что RFC 2822 по-прежнему является текущим документом, определяющим макет электронной почты?

Спасибо

Ответы [ 2 ]

3 голосов
/ 11 мая 2010

Поскольку большая часть электронной почты выполняется с использованием TCP / IP, вы можете читать по одному байту за раз, если вы действительно этого хотите. Базовая реализация буферизует поток для вас. Получается примерно 1400 байт за раз вне сети. Обычно я использую std::vector<char> или std::string в качестве буфера и считываю по одному байту за раз и push_back в буфер в цикле select() с коротким тайм-аутом.

Я не могу вспомнить, включает ли 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 голосов
/ 11 мая 2010

Если вы читаете из сокета, вы можете указать количество байтов, которое вы хотите read . Кроме того, вы можете динамически выделить буфер во время выполнения, используя new.

...