Здравствуйте, netch80, Вы писали:
N>Здравствуйте, Black_Moon, Вы писали:
B_M>>Написал smtp клиента
N>Код некорректен, не полностью описан (пропущены существенные моменты), и зверски неоптимален. N>_recv() читает просто приходящий кусок или строку? Если первое, он некорректен. Если второе, он или резко неоптимален (читает по байту), или использует секретный буфер, недокументированный в показанном коде. N>Зачем сокету выставлялся nonblocking, если это не используется? Если используется, где задание таймаутов? N>Почему размер буфера для одной команды равен MESSAGE_SIZE? При чём тут message? N>Зачем столько раз повторять код отсылки заголовков по одному? N>Зачем вызывать strlen сразу после sprintf_s? N>Добавляет ли encode64() нужные \r\n? N>Чему равен BLOCK_SIZE? Значение выше 57 — ошибка. И файл лучше читать через stdio, чтобы не делать лишние сисколлы. N>Зачем реагировать на ошибки от QUIT?
N>Итого. За код — твёрдая двойка. Копать дальше не хочу. "Ваши крокодилы — вы и спасайте"
N>_recv() читает просто приходящий кусок или строку
_recv() читает все что приходит от сервера за один заход (просто стоит ограничение на буфер — BLOCK_SIZE = 1023)
N>Зачем сокету выставлялся nonblocking, если это не используется? Если используется, где задание таймаутов?
сокет non-blocking — так как все _connect(), _send() и _recv() используют select с таймаутами (просто код не приведен). N>Почему размер буфера для одной команды равен MESSAGE_SIZE? При чём тут message?
Дело в том что я использую 2 буфера — один для отправки сообщений — 2й для получения ответа, соотв у них разные размеры.
N>Зачем столько раз повторять код отсылки заголовков по одному?
Зачем реагировать на ошибки от QUIT?
Тут верно — лишнее написано.
N>Чему равен BLOCK_SIZE? Значение выше 57 — ошибка.
Здесь можно поподробнее — откуда такая цифка 57.