Форум: "Сети";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
ВнизПроблема с 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c