![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глупый вопрос по TTCPClient [D7, Win2k]
alt7 © (2003-10-21 14:26:00)
Не могу понять вот какой вещи.
С помощью данного компонента коннекчусь к серверу, прохожу авторизацию и подписываюсь на определенные порции данных, пользуюсь методами ReceiveLn, SendLn, SendBuf. Это все в отдельной процедуре.
Затем эти данные ничанают сыпаться моему клиенту, НО обработчик TTCPClient.OnReceive не срабатывает, когда они приходят, почему?
Обходной путь, сделал таймер который срабатывает 10 раз в секунду, а в нем вызываю ReceiveLn для компонента, но это грузит процессор на все 100% и не подходит мне.
Главные вопросы: почему не срабатывает событие OnReceive, и что сделать, чтобы срабатывало без вышеупомянутого таймера?
Erik (2003-10-22 15:00:00) [1]
Блин ну и бодягу вы здесь развели.
alt7
Ты что такое TThread знаеш? Надеюсь, что знаеш вот его и используй. В нем читай в цикле приходящей буфер хотябы на 20 байт или сколько у тебя обычно приходит. Пока непрочитаеш висиш на этой строчке, после опять на нео поподеш. В томже цикле уведоми основной поток, что данные пришли!
Лично я если надо было, чтото просто сделать использовал Indy. Там есть твои любимае события, только используй UDP а то будеш спрашивать как приходящие данные склеивать. И посылай пакетами.
Rouse_ (2003-10-22 14:59:00) [2]
В OnReceive
Желаю успехов
ЗЫ: Так последний совет всеже помог?
alt7 (2003-10-22 14:40:00) [3]
Сделал, работаем без таймера...
Но тут беда видимо попроще ;))
Загрузка проца в норме, 1-3%...
На форме у меня TMemo и я вижу по нему, что данные приходят.. вот только не могу за заголовок подвигать к примеру..
Кажется Application.ProcessMessages надо куда-то положить, вопрос куда? Чтобы я мог нормально подвигать, или закрыть приложение...
Rouse_ (2003-10-22 14:04:00) [4]
Если срабатывает самое первое OnReceive то можно в конце приема сделать Receiveln; По идее должно по приходу данных опять отработать OnReceive. Это чтобы небыло зависимости от таймера.
alt7 (2003-10-22 14:01:00) [5]
Сомневаюсь. Обоснования:
Если я включаю таймер - логинюсь, подписываюсь на данные, даю команду STAR - сервер начинает передавать мне данные. OnReceive работает, вообщем если бы только не было загрузки проца на 100% - все было бы прекрасно.
Таймер выключаю - все, OnReceive не работает.
То есть, мои команды в порядке, отсылаю я их правильно, и сервер получает их правильно. Проблема на стороне клиента, а не сервера.
Клиент в BlockingMode. Насчет лога, сделаю сейчас - посмотрю, но очень сомневаюсь...
Спасибо..
Rouse_ (2003-10-22 13:56:00) [6]
Хм, у меня почемуто есть уверенность что вы отправляете всеже не то что вы думаете... Попробуйте писать в лог все данные которые отправлены и смотреть. Т.е. ушла строка в сеть, этуже строку без искажений в файл. Ушол элемент из буфера егоже в файл. И желательно сравнить как они приходят данные на сервер. Может быть еще проблема с асинхронностью.
Короче много вариантов. Вечером если не забуду постараюсь кинуть код.
alt7 (2003-10-22 13:50:00) [7]
Что-то вопроса я не понял...
То что я отсылаю серверу, то к ниму и приходит, а как же иначе?
Ничего ж не меняется все мои команды работают прекрасно.
Rouse_ (2003-10-22 13:41:00) [8]
А есть возможность узнать и сравнить какие данные отсылаются и приходят к нему?
alt7 (2003-10-22 13:37:00) [9]
Telnet
Rouse_ (2003-10-22 13:35:00) [10]
Я имею ввиду FTP, SMTP, POP3?
alt7 (2003-10-22 13:33:00) [11]
К сожалению не могу сказать IP-шник, коммерческая тайна ;))
Серьезно.
Rouse_ (2003-10-22 13:33:00) [12]
Что за сервер?
alt7 (2003-10-22 12:44:00) [13]
Так не работает, я даже авторизацию не могу пройти, вместо #13#10 я везде писал SendLN, и с ним работало
Rouse_ (2003-10-22 12:22:00) [14]
А смысл в RFC. Это стандарт. Ты вначале попробуй, а потом скажешь, получилось или нет.
Желаю успехов
alt7 (2003-10-22 12:17:00) [15]
А смысл?
Ведь авторизацию я прохожу, подписываюсь, на все это сервер отвечает ОК.
Если я включаю свой таймер, то данные принимаются, и я в OnReceive могу их обработать.
В OnTimer пишу Form_CTD.TTCPCClient.ReceiveLn;
А вот без этого постоянного срабатывания OnTimer, то бишь без постоянного ReceiveLn, OnReceive не срабатывает, и я не могу обработать поступающие данные.
Rouse_ (2003-10-22 12:09:00) [16]
Точнее я не правильно выразился.
К примеру ты коннектишся на РОР3-сервер.
Ты должен посылать в конце каждой комманды #13#10. (Т.е. буффер который ты посылаешь должен завершаться этими двумя кодами - перевод строки и возврат каретки)
К примеру:
user Rouse#13#10
+ OK
pass MyPassword#13#10
+ OK
stat#13#10
после этой комманды тебе и пойдет ответ
Желаю успехов
ЗЫ: Если я правильно понял о чем речь
Rouse_ (2003-10-22 12:01:00) [17]
Ааа, так сервер не твой? Если так то попробуй для начала приема данных посылать #13#10.
Желаю успехов
alt7 (2003-10-22 11:34:00) [18]
По пунктам:
1) Кода нет, потому как я не знаю куда его пихать, про это я уже много выше говорил, про OnReceive, таймер и иже с ними.
2) Приходится так, потому что сервер почему-то говорит BAD, а не OK, если весь буфер отсылать (сервер не наш).
3) Это просто перенесенный кусок из старого приложения, окончательную доводку и гм, оптимизацию кода еще рано делать.
Тут вот еще вопрос возник. Клиент работает в блокирующем режиме, сервер - не знаю в каком. Возможно ли, что если поставить клиенту асинхронный, то станет срабатывать событие OnReceive. Если я счас бред сказал, не пинайте - просто скажите ;))
Rouse_ (2003-10-22 09:31:00) [19]
Вопервых не вижу код который отвечает за прием данных от сервера, когда он начинает "Сыпать данными". Скорее ошибка в нем...
Второе, не буду ничего говорить про стиль написания, но вот этот момент мне не понятен:
for zz := 1 to Length(REQU) do
begin
SendChar := REQU[zz];
Form_CTD.TCPCClient.SendBuf(SendChar,1,0);
end;
А почему не весь буфер сразу отсылать?
Ну и еще:
> if (Pos("OK",Buffer) <> 0) and (Length(Buffer) = 2) then
Не кажется что будет проще:if Buffer = "OK" then ...
Желаю успехов
alt7 (2003-10-21 18:09:00) [20]
Видать завуалированный исходник ;))
У меня ведь все же вопрос более теоритический ;))
Если мне надо постоянно вызывать WaitForData или ReceiveLn, то с использованием таймера, грузим проц на 100%. Как это обойти?