Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как задать TimeOut на TcpClient.Connect


Страницы:   1 2 3

skosenok ©   (2006-10-17 11:23:00) 

Если устройство подключено в сеть то TcpClient.Connect обрабатывается быстро

Если устройство отключено то TcpClient.Connect ждет очень долго пока выдаст результат

Как ограничить время ожидания когда устройство отключено.


Dmitrij_K   (2006-10-19 11:19:00) [21]


> Сергей М. ©   (19.10.06 11:11) [22]

т.е. контроль неблокирующего режима возложили на нас?


Сергей М.   (2006-10-19 11:17:00) [22]

Пардон..

procedure TForm1.TcpClient1Error(Sender: TObject; SocketError: Integer);
var
 FDSet: TFDSet;
 TimeVal: TTimeVal;
begin
 if socketerror <> WSAEWOULDBLOCK then
   showmessage('error: ' + inttostr(socketerror))
 else begin
   FD_ZERO(FDSet);
   FD_SET(tcpclient1.handle, FDSet);
   TimeVal.tv_sec := 0;
   TimeVal.tv_usec := 500; //ожидаем коннекта не более 500 мс
   case select(0, nil, @FDSet, nil, @TimeVal) of
     0: begin
         showmessage('');
         tcpclient1.Close;
        end;
     SOCKET_ERROR: showmessage('error: ' + inttostr(WSAGetLastError));
   else
     tcpclient1.OnConnect(self);
   end;
 end;
end;


Сергей М.   (2006-10-19 11:16:00) [23]

TTCPClient написан нормально.
Но поскольку он позиционируется как кроссплатформенный компонент, в нем не реализована логика асинхронных нотификаций о транспортных событиях гнезда, ибо она специфична лишь для Win-платформы.
Т.е. в неблок.режиме для получения полной функциональной аналогии с TClientSocket требуется чуть-чуть подумать головой и приложить ручки в части реализации недостающих (но столь привычных) возможностей.


Сергей М.   (2006-10-19 11:11:00) [24]


> skosenok ©   (19.10.06 10:32) [18]


Хамишь, парниша.

uses Winsock;
..

procedure TForm1.TcpClient1Connect(Sender: TObject);
begin
 showmessage('connect')
end;

procedure TForm1.TcpClient1Error(Sender: TObject; SocketError: Integer);
var
 FDSet: TFDSet;
 TimeVal: TTimeVal;
begin
 if socketerror WSAEWOULDBLOCK then
   showmessage('error: ' + inttostr(socketerror))
 else begin
   FD_ZERO(FDSet);
   FD_SET(tcpclient1.handle, FDSet);
   TimeVal.tv_sec := 0;
   TimeVal.tv_usec := 500; //îæèäàåì êîííåêòà íå áîëåå 500 ìñ
   case select(0, nil, @FDSet, nil, @TimeVal) of
     0: begin
         showmessage('');
         tcpclient1.Close;
        end;
     SOCKET_ERROR: showmessage('error: ' + inttostr(WSAGetLastError));
   else
     tcpclient1.OnConnect(self);
   end;
 end;
end;


Dmitrij_K   (2006-10-19 11:06:00) [25]


> Т.е. TCPClient глюкаво написан

как это еще назвать? в справке ничего не нашел по поводу OnConnect для bmNonBlocking


SpellCaster   (2006-10-19 11:01:00) [26]


> Dmitrij_K

Т.е. TCPClient глюкаво написан? Хорошо, что не стал его юзать...


Dmitrij_K   (2006-10-19 10:49:00) [27]

skosenokне кричи.
Да, в TCPClient при bmNonBlocking не срадатывает OnConnect.
Почему? потому что код такой x!@#$, что легко посмотреть по F7+F8.
Просто пользуйся друким компанентом


skosenok   (2006-10-19 10:32:00) [28]

ага в 10 строке....

если ты такой умный что не можешь повторить пример который я говорил:

простой пример - кидаю на форму TcpClient и TcpServer
устанавливаю одинаковые LocalHost и LocalPort
сразу активирую TcpServer

выполняю код по нажатию клавиши: TcpClient.Connect

событие при при bmNonBlocking не срабатывает
procedure TForm1.TcpClientConnect(Sender: TObject);
begin
Application.MessageBox('Есть связь','!')
end;

что сложного... тормозить... или сам попробуй или вышли мне свое мыло (чтобы не светить) чтобы я тебе это скинул если лень... или ты струхнул гений?!?


Сергей М.   (2006-10-18 16:03:00) [29]


> skosenok ©   (18.10.06 15:54) [16]


Значит у тебя ошибка в программе.


skosenok   (2006-10-18 15:54:00) [30]

просто... не срабатывает событие при bmNonBlocking

procedure TForm1.TcpClientConnect(Sender: TObject);
begin
Application.MessageBox('Есть связь','!')
end;


Сергей М.   (2006-10-18 11:55:00) [31]


> код - то что я уже описывал пример


Из этого примера совершенно не понятны твои действия следом за строчкой if TcpClient1.Connect then ...


skosenok   (2006-10-18 11:30:00) [32]

код - то что я уже описывал пример

пришли мне свой адрес на skosenok@mail.ru


Сергей М.   (2006-10-18 08:38:00) [33]

Значит ты просто не дожидаешься события OnConnect.

Приводи конкретный код ...


skosenok   (2006-10-17 17:25:00) [34]

То, что как я уже сказал успешность не сообщается OnConnect при bmNonBlocking
а при bmBlocking  все пучком!


Сергей М.   (2006-10-17 16:21:00) [35]

Метод Connect() в неблок.режиме запускает операцию коннекта и немедленно возвращает управление.

Об успешном завершении этой операции сообщит событие OnConnect, о неуспешном - OnError.

Что не понятно ?


skosenok   (2006-10-17 14:56:00) [36]

это всё понятно...

я единственное спрашиваю - где я ошибся в примере... почему не работает?


Сергей М.   (2006-10-17 14:33:00) [37]


> skosenok ©   (17.10.06 13:58) [8]



> по отношению к серверу


Это как ?

Синхронность в дан.случае не подразумевает ни "сервер" ни "клиент".
Синхронность здесь подразумевает следующее: если ты вызвал одну из ф-ций приема/передачи, то инструкции, следующие за этим вызовом, будут выполнены лишь послетого, как будет выполнен фактическийввод/вывод в том или ином объеме запрошенных к вводу/выводу данных.


skosenok   (2006-10-17 13:58:00) [38]

> Сергей М. ©   (17.10.06 13:49) [7]

по отношению к серверу... но судя по твоему ответу это ни какого не имеет отшения к коннекту

так в чем у меня тогда проблема... если в эксперименте (примере который я привел)  OnConnect не вызывается?


Сергей М.   (2006-10-17 13:49:00) [39]


> skosenok ©   (17.10.06 13:45) [5]


Синхронным по отношению к чему/кому ?


Сергей М.   (2006-10-17 13:48:00) [40]


> где я ошибся?


Здесь:


> bmNonBlocking - асинхронная передача


bmNonBlocking означает не только асинхронную приемопередачу, но и асинхронный коннект.

При асинхронном коннекте единственным достоверным фактом его успешного установления является факт возбуждения события OnConnect. Ранее чем возникнет это событие нет никакого резона пыжиться с приемом-передачей.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо