Форум: "Сети";
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];
ВнизSMTP+ClientSocket Найти похожие ветки
← →
Дмитрий (2001-12-05 08:59) [0]Возникла нужда письмо руками собирать и клиента тоже самому писать, так вот:
procedure TSMTPSocket.Connect; //породил от ClientSocket
begin
if Self.Host<>"" then
try
Self.Active:=true;
Self.Analyse(Self.Socket.ReceiveText, "220"); // сервер представился
Self.Socket.SendText("HELO "+Self.Host+#13#10); //и я поздоровался
Self.Analyse(Self.Socket.ReceiveText, "250");
except
on E: Exception do
begin
(* *)
Self.Close;
end;
end;
end;
Self. добавил специяльно - это и есть TSMTPSocket.
В процедуре Analyse возбуждается исключение, если ожидаемый код не совпадает с передаваемым.
Грабли в том, что если по этой конструкции лазать с дебаггером - все на ура, а если RUN - ощущение, что сервер начинает отставать на 1 шаг, рассинхронизация, то бишь. Пачему?
← →
Digitman (2001-12-06 09:26) [1]Ты уверен, что сервер ждет, пока ты "поздороваешься", прежде чем слать тебе очеред.строку ?
← →
Polevi (2001-12-06 09:52) [2]2Digitman ©
Насколько я помню так работает SMTP протокол..
← →
Дмитрий (2001-12-06 11:30) [3]Уточню^
после открытия порта сервер посылает
220 server.ru ESMTP ...
->HELO server.ru
250 server.ru Helo ...
Так вот: при отладке все нормально, а без нее я сначала получаю пустую строку, затем, после HELO получаю ответ 220 (пресловутая задержка)
Тот же самый код на Perl:
use Socket;
use IO::Socket;
$socket = IO::Socket::INET->new(
PeerAddr => "192.168.0.18",
PeerPort => "25",
Proto => "tcp"
) or die $!;
$socket->autoflush();
print $str = <$socket>;
print $socket "helo 192.168.0.18\n";
print $str = <$socket>;
- все нормально.
← →
Дмитрий (2001-12-06 12:33) [4]Всем спасибо, Indy скачал. Работает.
← →
Digitman (2001-12-06 12:33) [5]да сервер просто не успевает еще "представиться", когда ты выполняешь строчку
Self.Analyse(Self.Socket.ReceiveText, "220") !
вот ты и получаешь пустую строку, поскольку от сервера еще ничего не пришло (и идешь дальше !).
метод ReceiveText надо выполнять в обработчике события OnRead, когда в приемном буфере гнезда ДОСТОВЕРНО есть данные, приятые от передающей стороны (SMTP-сервера , в твоем случае). Событие OnRead есть сигнал, по которому ты должен читать то, что тебе передали. И ни в какой другой момент !
← →
Дмитрий (2001-12-06 13:27) [6]Digitman, спасибо. Я уже расковырял TIDTCPClient :)
← →
Digitman (2001-12-06 13:45) [7]думаешь, он надежней работает, чем TClientSocket ?
← →
Дмитрий (2001-12-06 13:56) [8]Winshoes у меня уже почти год стоит. Indy - поновее. И Indy(Winshoes) -компоненты умеют через Socks работать. Я бы с удовольствием TSocketClient "улучшил" - но - есть желание, но нету времени :)
← →
Digitman (2001-12-06 14:18) [9]Не просветишь ли - чем же ты его хочешь "улучшить" ? Чем TclientSocket тебя не устраивает в первозданном виде ? Конкретно.
← →
Дмитрий (2001-12-06 15:01) [10]Тем, что он через Socks не работает.
<Драться с вами не хочу :)>
← →
Digitman (2001-12-06 15:18) [11]а Indy еще чего-то "не умеет" ) Так и будешь метаться, не разобравшись до конца в фукнкциональности того, на что сделал ставку ? Вряд ли у тебя при таком подходе что-то путное выйдет) ... извини уж , но это - мое imho )))
← →
Digitman (2001-12-06 15:23) [12]видишь ли, чем сложнее оболочка одного и того же же WinsockAPI-интерфейса, тем "темнее лес", тем меньше надежность и тем сложнее понимание внутренней логики объекта. Случись чего в финальном релизе твоей задачи - что будешь делать ? "Выкидывать" Indy и "перелопачивать" весь свой код под какой-нибудь очередной Hindy ? Несерьезно это)
← →
Дмитрий (2001-12-06 15:31) [13]>> не разобравшись до конца в фукнкциональности
:)) а где конец ? уяснить строение класса? выучить socket api ? самому перепрошить устройство ввода-вывода (сетевую карту) ?
>> Вряд ли у тебя при таком подходе что-то путное выйдет
Уже вышло. Эта проблема - последняя. Она решена. За помощь - еще раз - спасибо. все мы немного ламеры. и т.д. и. т.п.
← →
Digitman (2001-12-06 15:40) [14]как знаешь)... мое дело - поделиться собственным опытом. Не жалко)
← →
Дмитрий (2001-12-06 15:48) [15]А, ну тогда - можете еще поделиться :))
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.004 c