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

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

Проблема с TclientSocket [D5]


_san_ ©   (2003-12-10 18:29:00) 

Добрый вечер!
Почему когда я ставлю свойство
ClientSocket.ClientType:= ctBlocking;
у меня перестают читаться данные от другого приложения?
Если ClientSocket.ClientType:= ctNonBlocking;
то все нормально.


_san_   (2003-12-11 15:10:00) [1]

>Если сервер твой - то наиболее правильно перед посылкой данных >посылать их размер.

>что же мешает передающей стороне предварять поток собственно >данных префиксом их размера ?

Сервер не мой, но договориться, наверное можно, чтобы они у себя добавили размер передаваемых данных.
Все.
Всем спасибо!


Digitman   (2003-12-11 14:02:00) [2]


> при этом я не знаю размер получаемых данных


что же мешает передающей стороне предварять поток собственно данных префиксом их размера ? чтобы приним.сторона, получив сначала префикс, ожидала следом данные заведомо известного размера ?


savva   (2003-12-11 14:01:00) [3]

Если сервер твой - то наиболее правильно перед посылкой данных посылать их размер. Если не твой - то расскажи про него подробнее. Можно наверное по времени отсутствия данных (ИМХО не самый красивый путь) и то при условии что даные идут не активно.

К тому же прочитать больше чем пришло тебе не удастся. Вопрос другой, а являются полученные данные целостными или это какая то часть. А чтоб ответить на этот вопрос - читай начало этого ответа..


Digitman   (2003-12-11 13:59:00) [4]

а зачем его ожидать ? когда принятые данные будут доступны, возникнет событие OnRead, осн.поток прочитает их в обработчике события и, если обработка данных длительная, передаст данные на обработку доп.потоку, если же недолгая обработка - тут же и обработает их

все прочее время, между моментами возникновения событий OnRead() осн.поток может и будет реагировать на все прочие сообщения/события, в т.ч. и события польз.интерфейса

главное - чтобы обработка ЛЮБЫХ сообщений/событий в код.потоке была по возможности максимально быстрой


_san_   (2003-12-11 13:56:00) [5]

Спасибо за помощь.
У меня еще вопрос: а если я буду читать данные функцией Read(), то можно ли как-нибудь определить, что все данные прочитаны, при этом я не знаю размер получаемых данных.


savva   (2003-12-11 13:54:00) [6]

ну в хелпе же написано " Set the ErrorCode parameter to 0 if the OnError event handler successfully deals with the error condition, to prevent an ESocketError from being raised"
то бишь установи параметр ErrorCode равным 0 если обработчик события OnError успешно выполнен для предотвращения возбуждения ошибки ESocketError (очень вольный перевод:))


_san_   (2003-12-11 13:53:00) [7]

дополнительный поток мне нужен для того чтобы приложение не подвисало когда я ожидаю события приема данных с помощью функции WaitForSingleObject


_san_   (2003-12-11 13:50:00) [8]

событие OnError действительно спасает, но при этом системное сообщение об ошибке соединения все равно вылетает.


Digitman   (2003-12-11 12:20:00) [9]


> В потоке происходит формирование посылки
> Которую посылаю через сокет


а что, это нельзя сделать в основном потоке ? режим же - неблокирующий тебе нужен, сам говоришь ... зачем доп.поток-то ?


savva   (2003-12-11 11:56:00) [10]

для асинхронного режима событие OnError и тип TSocketErrorEvent спасут отца русской демократии :)


_san_   (2003-12-11 11:52:00) [11]

А нет другой возможности перехватывать сообщение об ошибки соединения:
if not ClientSocket1.Active then
begin
try
ClientSocket1.Active:= true;
except
MessageDlg(‘Связь с устройством не установлена.",
mtError , [mbOK], 0);
end;
end;
без использования:
ClientSocket.ClientType:= ctBlocking;


Digitman   (2003-12-11 10:38:00) [12]

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


_san_   (2003-12-10 19:20:00) [13]

//Открываю сокет
ClientSocket1.ClientType:= ctNonBlocking;
if not ClientSocket1.Active then
begin
try
ClientSocket1.Active:= true;
except
MessageDlg(‘Связь с устройством не установлена.",
mtError , [mbOK], 0);
end;
end;

//Создаю поток - в нем будет вестись обработка данных
Myhread := TMyThread.Create(true);

В потоке происходит формирование посылки
Которую посылаю через сокет

ClientSocket1.Socket.SendText(strSend);

Далее ожидаю ответа

//с контроллера
hRel:= WaitForSingleObject(SinglEnblWrDataMem, 5000);
if hRel = 0 then
begin
…..
…..
end;

Если ClientSocket.ClientType:= ctNonBlocking; то ответ приходит
А если ClientSocket.ClientType:= ctBlocking; то нет

Сигнал SinglEnblWrDataMem устанавливается в функциии, когда приходят данные:
procedure ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var


Digitman   (2003-12-10 18:58:00) [14]

приводи сюда свой код


_san_   (2003-12-10 18:50:00) [15]

А не у кого нет ссылок на примеры по программированию сокетов?


Digitman   (2003-12-10 18:36:00) [16]

значит, логика неверна


Наверх

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