Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
3-38721
Evyshka
2004-01-20 09:31
2004.02.13
Запросик в Paradox


1-38860
AndersoNRules
2004-02-02 12:16
2004.02.13
Mojno li programno dati useru bolishe privelegii chem esti ...


1-38845
Mazer
2004-02-02 15:34
2004.02.13
Как добавить в стандартное контекстное меню свои пункты?


1-38912
Olivka
2004-02-04 12:21
2004.02.13
Параметры запроса в FIBdataset.UpdateSQL


1-38770
_BasiL_
2004-02-03 14:24
2004.02.13
Console & ReadKey





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский