![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
работа с TTCPClient [D7]
plotn © (2007-08-24 14:55:00)Добрый день, коллеги! Проясните небольшой вопрос.
Я пользуюсь вышенаписанным компонентом. Посылаю запрос к tcp серверу и получаю ответ, делаю так:
tcpClientCS.RemoteHost := наш_хост
tcpClientCS.RemotePort := наш_порт
tcpClientCS.Connect;
if tcpClientCS.Connected then
begin
....
tcpClientCS.SendBuf(pchar(s)^, length(s), 0);
....
iReceived := tcpClientCS.ReceiveBuf(bytes4[0], 4, 0);
Проблема в следующем. Если данные нам не посылаются, то у меня все приложение "зависает". Т.е. я пытаюсь коннектиться туда, где сервера вообще нету. И превед. Или читаю больше чем дают. Нельзя ли каким либо образом настроить таймаут, что ли, что например после какого то времени была бы ошибка чтения данных?
Спасибо заранее
Сергей М. (2007-08-27 15:27:00) [1]
> не хочу заморачиваться ни с отдельным потоком ни с какими
> либо дополнительными умствованиями
Ну тогда пользуй TIdTCPClient + TIdAntifreeze - этот "джентельменский набор" как раз и создан для тех кто не хочет "заморачиваться" и "умствовать".
Eraser (2007-08-27 15:17:00) [2]
> plotn (24.08.07 20:11) [6]
TIdTcpClient отлично подойдет для этих целей.
> plotn (24.08.07 20:20) [7]
> допустим, файл. Т.е. я прошу - дайте мне икс байт, оно мне
> дает. Я сравниваю размер того, что мне дадено с тем что
> я просил и, если дали меньше, предполагаю
тут от прикладного протокола зависит конечно, чаще всего сначала сервер отсылает размер данных, которые нужно принять, а потом сами данные.
plotn (2007-08-24 20:20:00) [3]поясню все таки - я отлично понимаю как читать, допустим, файл. Т.е. я прошу - дайте мне икс байт, оно мне дает. Я сравниваю размер того, что мне дадено с тем что я просил и, если дали меньше, предполагаю, что читать больше не надо, это конец чтения. Примерно на это же я рассчитываю тут. Но специфики не знаю, поэтому и иду с вопросами к вам.
plotn (2007-08-24 20:11:00) [4]Тогда посоветуйте пожалуйста. Я не хочу заморачиваться ни с отдельным потоком ни с какими либо дополнительными умствованиями, потому что у меня очень простой проект. Это плугин к IBExpertу, его единственная задача - запуститься, спросить сервер о данных, получить их. Даже если во время скачивания данных проект будет зависать чуток (ну, таймаут) - это мелочь. Т.е. мне нужен всего лишь инструмент для того чтобы выкачать данные, что мне нужны, если они ошибочны или связь плохая - сказать об этом, не зависая навсегда. Короче говоря, языком этого компонента мне нужно: адрес, порт, коннект, коннектед, врайт, реад; ну и все пожалуй. Т.е. хотелось бы сразу чтобы вы ткнули носом в те свойства, которые мне нужны.
Спасибо за терпение.
Eraser (2007-08-24 17:06:00) [5]
> Сергей М. © (24.08.07 15:20) [4]
и точно, пардон.
тогда [2] самый верный совет.
Сергей М. (2007-08-24 15:20:00) [6]
> Eraser © (24.08.07 15:12) [3]
TTCPClient - это не Инди-компонент, ты перепутал.
Eraser (2007-08-24 15:12:00) [7]
> plotn (24.08.07 14:55)
> Если данные нам не посылаются, то у меня все приложение
> "зависает".
так и должно быть, т.к. компоненты indy работают в синхронном режиме. Рекомендую вынести код работы с сетью в доп. поток.
> Или читаю больше чем дают.
это недопустимо.
> Нельзя ли каким либо образом настроить таймаут, что ли,
> что например после какого то времени была бы ошибка чтения
> данных?
tcpClientCS.ConnectTimeout/ReadTimeout.
Сергей М. (2007-08-24 15:10:00) [8]Чем не угодили TClientSocket, TIdTCPClient ?
Сергей М. (2007-08-24 15:04:00) [9]
> Нельзя ли каким либо образом настроить таймаут
Нельзя.
Компонент не предусматривает таймауты.