Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.06.14;
Скачать: CL | DM;

Вниз

событие TTcpClient.OnConnect   Найти похожие ветки 

 
_Андрей   (2009-04-24 09:45) [0]

Здравствуйте, пытаюсь через сокеты подсоединиться к FTP, использую TTcpClient с закладки Internet. Делаю так:

procedure TForm1.Button1Click(Sender: TObject);
begin
 TcpClient.LocalHost := "127.0.0.1";
 TcpClient.LocalPort := "4567";
 TcpClient.Connect
end;

procedure TForm1.TcpClientError(Sender: TObject; SocketError: Integer);
begin
 MessageBox(handle, PChar(Format("Error [%d]", [SocketError])), PChar  ("Socket"),  MB_OK or MB_ICONERROR)
end;

procedure TForm1.TcpClientConnect(Sender: TObject);
begin
 MessageBox(handle, PChar("Connect!"), PChar("Socket"),
   MB_OK or MB_ICONINFORMATION)
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if TcpClient.Connected then TcpClient.Disconnect
end;


В неблокирующем режиме коннектится (и вызывается событие TTcpClient.OnConnect), в блокирующем выдаёт ошибку "10035", прочёл что это "не совсем ошибка", а скорее сообщение говорящее о том что операция не может быть выполнена немедленно. "Ок, как скажете...". Непонятно же почему не вызывается событие TTcpClient.OnConnect, то есть непонятно как же мне узнать о факте соединения... подскажите, плиз, как быть...


 
Сергей М. ©   (2009-04-24 10:32) [1]


> в блокирующем выдаёт ошибку "10035"


Ты ничего не перепутал ?

Такая ошибка может возникнуть именно в неблокирующем режиме, поскольку ф-ция winsock.connect в этом режиме запускает асинхронную операцию коннекта, о чем собссно и информирует код ошибки WSAEWOULDBLOCK=10035.

Вот цитата из "генофонда" c комментариями:


procedure TCustomIpClient.Open;
var
 addr: TSockAddr;
begin
 inherited Open;
 if Active and not FConnected then
 begin
   addr := GetSocketAddr(FRemoteHost, FRemotePort);
..
   FConnected := ErrorCheck(WinSock.connect(FSocket, addr, sizeof(addr))) = 0;
..
   if FConnected then
     DoConnect; //здесь вызывается обработчик события OnConnect, если он назначен
 end;
end;



> как же мне узнать о факте соединения


В блокирующем режиме о факте успешного коннета сообщит либо True-результат вызова ф-ции Connect либо факт вызова обработчика OnConnect

В неблокирующем режиме в этом компоненте все сложнее.
По факту возникновения события OnError с кодом отказа WSAEWOULDBLOCK следует имея хэндл гнезда (см. TTcpClient.Handle) вызывать циклически ф-цию select(), которая рано или поздно сообщит о факте успешного (параметр writefds) или неуспешного (параметр exceptfds) коннекта.


 
_Андрей   (2009-04-24 10:37) [2]


> Ты ничего не перепутал ?


Да-да, разумеется "в неблокирующем", ошибся, извините...

По поводу TTcpClient.Handle сейчас попробую, спасибо!


 
_Андрей   (2009-04-24 11:02) [3]

Да, касательно коннекта это работает, спасибо большое, ни в жизнь бы не догадался (только я остановился пока на использовании TcpClient.WaitWaitForData, более читабельный вид всё-таки)


 
Сергей М. ©   (2009-04-24 11:55) [4]


> остановился пока на использовании TcpClient.WaitWaitForData


К коннекту в каком бы то ни было режиме этот метод не имеет отношения.


 
_Андрей   (2009-04-24 13:40) [5]

Я имею ввиду его использование вместо Select

function TBaseSocket.WaitForData(TimeOut: Integer): Boolean;
var
 ReadReady, ExceptFlag: Boolean;
 c: Char;
begin
 Result := False;
 // Select also returns True when connection is broken.
 if Select(@ReadReady, nil, @ExceptFlag, TimeOut) then
   Result := ReadReady and not ExceptFlag and
     (PeekBuf(c, sizeof(c)) = 1);
end;


 
Сергей М. ©   (2009-04-24 14:39) [6]


> имею ввиду его использование вместо Select


Не получится.

WaitForData не может отследить факт подключения, если партнер по соединению будет молчать.


 
_Андрей   (2009-04-24 15:01) [7]

хм... после такого "коннекта" я вызывал Receiveln и он мне выдавал что-то типа: "220 FTP server ready и т.д.", откуда ж тогда он это брал, с "прошлых коннектов" сокета?


 
Сергей М. ©   (2009-04-24 15:09) [8]


> откуда ж тогда он это брал, с "прошлых коннектов" сокета?


Зачем  ? С этого коннекта и взял - сервер-то не молчит.. Сразу после коннекта сервер представился, по всем, тэкскэть, канонам FTP)..

Я тут немного "затормозил" - упустил из виду, что речь идет конкретно об FTP.
Т.е. о частном случае, в котором WaitForData м.б. в принципе использован для обнаружения факта состоявшегося коннекта.

А в общем случае WaitForData для этой цели неприменим по причине [6]



Страницы: 1 вся ветка

Текущий архив: 2009.06.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
4-1210845453
DJ Kondakov
2008-05-15 13:57
2009.06.14
Координата правого нижнего угла экрана


2-1240749151
Dmitrii
2009-04-26 16:32
2009.06.14
что возврошает функция Integer(str) ?


15-1239092112
Cobalt
2009-04-07 12:15
2009.06.14
Установка JEDI


15-1239046670
Nic
2009-04-06 23:37
2009.06.14
Автовыравнивающаяся табличка html


2-1240901262
Кирей
2009-04-28 10:47
2009.06.14
Ошибка в роезультатах очень простого запроса