![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как задать TimeOut на TcpClient.Connect
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. Ранее чем возникнет это событие нет никакого резона пыжиться с приемом-передачей.