Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Непонятно поведение TIdTCPServer   Найти похожие ветки 

 
zsv ©   (2009-12-16 13:14) [0]

День добрый. Ранее с TCP/IP не сталкивался, поэтому возможно вопрос будет смешным....
Создаю две програмки, в одной TIdTCPServer в другой TIdTCPClient. Настраиваю хост,порт. Запускаю. на сервере стартую IdTCPServer.Active:=true;
на серваке определил обработчики:

procedure TfrmMain.IdTCPServerConnect(AThread: TIdPeerThread);
begin
Memo1.Lines.Add(FormatDateTime("hh:nn:ss.zzz",now)+" - Соединение");
end;

procedure TfrmMain.IdTCPServerExecute(AThread: TIdPeerThread);
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin Memo1.Lines.Add(FormatDateTime("hh:nn:ss.zzz",now)+" - Выполнение"); sleep(1000); end;
end;

procedure TfrmMain.IdTCPServerDisconnect(AThread: TIdPeerThread);
begin
if AThread.Terminated Or Not AThread.Connection.Connected then
Memo1.Lines.Add(FormatDateTime("hh:nn:ss.zzz",now)+" - Отсоединение");
end;

При коннекте на клиенте, на сервере срабатывает первый обработчик и начинает выполнение второй.
При попытке Disconnect на клиенте, на сервере ничего не происходит и "Выполнение" попрежнему происходит и третий обработчик тоже не запускается.
В чем прикол?


 
Медвежонок Пятачок ©   (2009-12-16 13:25) [1]

так как второй обработчик ничего не делает, он бес понятия о текущем состоянии соединения. поэтому

второе:
из вторичных потоков нельзя работать с мемами и другими элементами gui


 
zsv ©   (2009-12-16 14:05) [2]

на счет вторичных потоков и vcl я знаю, просто временно для пробы сделал.
а что значит ничего не делает... что нужно делать, чтобы он знал состояние AThread.Connection.Connected?


 
Медвежонок Пятачок ©   (2009-12-16 14:06) [3]

ну для начала хотя бы читать то, что ему клиент шлет.


 
zsv ©   (2009-12-16 14:10) [4]

а я пока ничего не слал, только подключился и отключаюсь.... ну сейчас попробую прочитать...


 
Медвежонок Пятачок ©   (2009-12-16 14:11) [5]

и еще поправка.
OnDisconnect генерируется только если сам сервер вызвал DoDisconnect или то, что вызывает DoDisconnect

разрыв соединения по инициативе клиента не приводит к этому событию


 
Медвежонок Пятачок ©   (2009-12-16 14:15) [6]

а я пока ничего не слал, только подключился и отключаюсь.... ну сейчас попробую прочитать...

сервер ничего не делает.
ни пишет и не читает.

в таком случае не по барабану ли ему, подключен к нему клиент или не подключен?
сервер же нифига не делает.


 
zsv ©   (2009-12-16 14:23) [7]

вроде получилось.. спасибо. ну это наверняка у меня не последний вопрос был :-)))


 
zsv ©   (2009-12-16 20:03) [8]

Теперь пытають клиентом отправить текст сообщ с пом. Writeln(msg)
а вот на сервере не могу его принять

procedure TfrmMain.IdTCPServerExecute(AThread: TIdPeerThread);
var s:string;
begin
   if not AThread.Terminated and AThread.Connection.Connected then begin
      s:=AThread.Connection.ReadLn;
      if s<>"" then begin
      TextToLog:=s;
      AThread.Synchronize(frmMain.PrintToLog);
      end;
   end;
end;

будто зависает на строке    s:=AThread.Connection.ReadLn;
(смотрел в трейсе)


 
Медвежонок Пятачок ©   (2009-12-16 21:41) [9]

ждет ограничителя строки видимо


 
zsv ©   (2009-12-17 06:42) [10]

а какой должен быть ограничитель? Я посылаю данные с помощью WriteLn, я так понимаю, что там ограничитель присутствует...
кстате попробовал еще считать с помощью  s:=AThread.Connection.ReadLn(lf,10); все равно ожидает неограниченное время, те тймайт не срабатывает... Что неправильно написал?


 
Anatoly Podgoretsky ©   (2009-12-17 08:45) [11]

> zsv  (17.12.2009 06:42:10)  [10]

Для строк стандартный разделитель CRLF


 
Медвежонок Пятачок ©   (2009-12-17 09:36) [12]

будто зависает на строке    s:=AThread.Connection.ReadLn;

так он же у тебя зациклен.


 
zsv ©   (2009-12-17 12:31) [13]

как зациклен? я ставлю брекпоинт, выполняю s:=AThread.Connection.ReadLn;
и все,  до след. команды не доходит...
> Для строк стандартный разделитель CRLF
а WriteLn этот разделитель не вставляет?


 
Сергей М. ©   (2009-12-17 14:07) [14]


> zsv ©   (17.12.09 12:31) [13]


Не помню как в 9-ке, а в 10-ке WriteLn по дифолту дополняет отправляемую строку терминатором EOL (константа определена как CR + LF), а ReadLn без параметров ожидает строку с терминатором LF


 
Сергей М. ©   (2009-12-17 14:09) [15]


> zsv ©   (17.12.09 12:31) [13]
>
> как зациклен?


Он имел ввиду что обработчик OnExecute вызывается в цикле, условием штатного выхода из которого по умолчанию является Connected = False


 
zsv ©   (2009-12-17 14:43) [16]

>Не помню как в 9-ке, а в 10-ке WriteLn по дифолту дополняет отправляемую строку терминатором EOL (константа определена как CR + LF), а ReadLn без параметров ожидает строку с терминатором LF.

Да, дело было в этом...
так s:=AThread.Connection.ReadLn(EOL); все заработало



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

Форум: "Сети";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.064 c
15-1352799802
Handler
2012-11-13 13:43
2013.03.22
названия пунктов меню


2-1333473036
Usver
2012-04-03 21:10
2013.03.22
Перевод с C++ на Delphi


2-1332009127
pooh001
2012-03-17 22:32
2013.03.22
регистронезависимый запрос SQL (Absolute DB или Accuracer)


15-1331924751
Lamer?
2012-03-16 23:05
2013.03.22
Delphi xe


15-1339488214
ProgRAMmer Dimonych
2012-06-12 12:03
2013.03.22
Кириллические домены и GetAddrInfoW





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский