![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы с ASender.Thread.Connection в Indy 9 [D7, Win95/98, WinME, NT4, Win2k, WinXP]
samael6 © (2007-06-05 21:29:00)Такая проблема: у меня почтовый сервер и все нормально, если не отсылать клиенту большие письма :)
Полностью они до него не доходят. Я отправляю все письмо по строчно, и многие строки теряются. Но если сделать задержку после каждой посылки, то все дойдет.
Вот код:
ASender.Thread.Connection.WriteLn('+OK ' + IntToStr(intSize) + ' octets');
for i := 0 to MessageStrings.Count - 1 do begin
ASender.Thread.Connection.Writeln(MessageStrings.Strings[i]);
end;
где, intSize - integer: размер письма;
MessageStrings - TStrings: само письмо построчно.
Если в тело цикла вставить sleep(1), то все пойдет, но слишком медленно.
Что я не учел?
Спасибо
Samael6 (2007-06-08 19:21:00) [1]9 (см. тему ветки)
Сергей М. (2007-06-08 16:28:00) [2]Т.е. ты утверждаешь, что если чуть подправить демо-проект в части отправки твоих "крупных" писем, то возникает та же самая проблема ?
А версия Инди какая ?
Samael6 (2007-06-08 14:54:00) [3]Он практически пустой. Только немного комментария и построчная отправка простого письма клиенту. У меня все тоже самое, но письма не такие мелкие...
Сергей М. (2007-06-08 14:06:00) [4]
> Samael6 © (08.06.07 13:51) [10]
Ну есть же демо-проект в составе Инди с использованием поп3-сервера, почему не сравнить его со своим ?
Samael6 (2007-06-08 13:51:00) [5]Так в чем же тогда трабла?
Может клиент не готов к приему письма построчно и ему нужно передавать блоково? Аля, сначала хидер, затем боди и никак иначе?
Возможно ли такое? Или проблема в другом?
Сергей М. (2007-06-08 08:25:00) [6]
> Samael6 © (07.06.07 19:59) [8]
> буфер сокета не успевает отчищаться (выгребаться), и следовательно
> происходит перезатирание предыдущего значения
Ерунда полнейшая.
Инди использует синхронный транспортный режим.
А подобного рода засада может поджидать только в асинхронном режиме.
> Может как-то можно определить, произошло ли чтение из сокета
> и готов ли он уже к новой порции данных?
На прикладном уровне нельзя.
Да и не нужно это.
Потому что TCP - поточный протокол.
Samael6 (2007-06-07 19:59:00) [7]Закономерности ворде нет, похоже что буфер сокета не успевает отчищаться (выгребаться), и следовательно происходит перезатирание предыдущего значения.
По крайней мере так оно смотрится, а лечение путем задержки это только подтверждает.
Может как-то можно определить, произошло ли чтение из сокета и готов ли он уже к новой порции данных?
Сергей М. (2007-06-07 16:26:00) [8]
> многие строки теряются
"Многие" - это какие ?
Какова закономерность ?
Samael6 (2007-06-07 16:25:00) [9]Нет,
это разные ветки и разные проблемы с разными программами
Сергей М. (2007-06-07 12:53:00) [10]
> Клиент - The Bat!
А здесь
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1181070583&n=4
ты почему-то ведешь речь о собственном клиенте ..
Samael6 (2007-06-06 16:56:00) [11]Клиент - The Bat!
Сергей М. (2007-06-06 14:37:00) [12]
> Полностью они до него не доходят
Показывай как принимаешь письма на стороне клиента ..
Samael6 (2007-06-06 13:23:00) [13]Да, именно через него я это и делаю.
Из-под обработчика OnRETR.
Сергей М. (2007-06-06 08:12:00) [14]
> samael6 © (05.06.07 21:29)
В чем прелесть изобретения велосипеда ?
Ведь есть же готовыйкомпонент - TIdPOP3Server ..