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

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

работа с 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]


> Нельзя ли каким либо образом настроить таймаут


Нельзя.
Компонент не предусматривает таймауты.


Наверх

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