Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.13;
Скачать: CL | DM;

Вниз

Проблема с TclientSocket   Найти похожие ветки 

 
_san_   (2003-12-10 18:29) [0]

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


 
Digitman ©   (2003-12-10 18:36) [1]

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


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

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


 
Digitman ©   (2003-12-10 18:58) [3]

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


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

//Открываю сокет
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-11 10:38) [5]

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


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

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


 
savva ©   (2003-12-11 11:56) [7]

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


 
Digitman ©   (2003-12-11 12:20) [8]


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


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


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

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


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

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


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

ну в хелпе же написано " 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:56) [12]

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


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

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

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

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


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

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

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


 
Digitman ©   (2003-12-11 14:02) [15]


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


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


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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.02.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.033 c
3-38675
denis24
2004-01-24 10:55
2004.02.13
поиск в базе


3-38674
Lucky_elf
2004-01-24 16:45
2004.02.13
Не работает LIKE в IB


14-39095
Wonder
2004-01-21 13:27
2004.02.13
Microsoft зажралась. Тихо шифером шурша ...


1-38879
td
2004-02-03 19:50
2004.02.13
взаимные ссылки


14-39084
Agent13
2004-01-22 18:36
2004.02.13
Пиратам - нет!