У меня проблемы с реализацией протокола SMTP через WinSock API. Вот что я делаю сейчас. Клиент создает неблокирующий сокет, подключается к серверу и обменивается с ним данными.
Он использует примитив "send string", который эффективно вызывает send()
в цикле, пока не будет передана вся строка, и примитив "receive string", который вызывает recv()
в цикле, пока строка, заканчивающаяся CRLF, не будет накоплена или не произойдет тайм-аут .
Вышеупомянутый тупой подход работает, за исключением одного конкретного сервера, развернутого на сайте клиента. На этот сервер клиент отправляет EHLO
, AUTH
, MAIL FROM
, RCPT
, DATA
, каждый раз получая разумный ответ. Затем он отправляет тело почтового сообщения построчно (не пытаясь получить что-либо от сервера) и через некоторое время send()
(отправлено несколько сотен строк), возвращая WSAEWOULDBLOCK
.
Как мне справиться с этим? Нужно ли проверять наличие ожидающего ввода в сокете после каждой строки? Или что еще я должен сделать, чтобы предсказать и, возможно, предотвратить эту ситуацию?