Нужно ли прослушивать вывод сервера при отправке данных на SMTP-сервер? - PullRequest
0 голосов
/ 02 июня 2010

У меня проблемы с реализацией протокола SMTP через WinSock API. Вот что я делаю сейчас. Клиент создает неблокирующий сокет, подключается к серверу и обменивается с ним данными.

Он использует примитив "send string", который эффективно вызывает send() в цикле, пока не будет передана вся строка, и примитив "receive string", который вызывает recv() в цикле, пока строка, заканчивающаяся CRLF, не будет накоплена или не произойдет тайм-аут .

Вышеупомянутый тупой подход работает, за исключением одного конкретного сервера, развернутого на сайте клиента. На этот сервер клиент отправляет EHLO, AUTH, MAIL FROM, RCPT, DATA, каждый раз получая разумный ответ. Затем он отправляет тело почтового сообщения построчно (не пытаясь получить что-либо от сервера) и через некоторое время send() (отправлено несколько сотен строк), возвращая WSAEWOULDBLOCK.

Как мне справиться с этим? Нужно ли проверять наличие ожидающего ввода в сокете после каждой строки? Или что еще я должен сделать, чтобы предсказать и, возможно, предотвратить эту ситуацию?

1 Ответ

0 голосов
/ 02 июня 2010

Из документации :

Эта ошибка возвращается из операций с неблокирующими сокетами, которые не могут быть завершены немедленно, например, recv, когда нет данных, ожидающих чтения из сокета. Это нефатальная ошибка, и операцию следует повторить позже.

...