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

Вниз

Непонятно поведение 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.135 c
15-1336034354
ZeroDivide
2012-05-03 12:39
2013.03.22
Delphi перестала работать комбинация Ctrl+Shift+стрелки,


15-1346257406
Разведка
2012-08-29 20:23
2013.03.22
Проблема нехватки памяти


15-1338356867
AV
2012-05-30 09:47
2013.03.22
Наглядно изобразить ход работы графиком


15-1341824763
Дмитрий С
2012-07-09 13:06
2013.03.22
Teamviewer может отвечать на запросы UAC...


15-1338150603
Юрий
2012-05-28 00:30
2013.03.22
С днем рождения ! 28 мая 2012 понедельник