Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Непонятно поведение TIdTCPServer [D7, WinXP]


zsv ©   (2009-12-16 13:14:00) 

День добрый. Ранее с 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 на клиенте, на сервере ничего не происходит и "Выполнение" попрежнему происходит и третий обработчик тоже не запускается.
В чем прикол?


zsv   (2009-12-17 14:43:00) [1]

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

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


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


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


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


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


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


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


zsv   (2009-12-17 12:31:00) [4]

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


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

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

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


Anatoly Podgoretsky   (2009-12-17 08:45:00) [6]

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

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


zsv   (2009-12-17 06:42:00) [7]

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


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

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


zsv   (2009-12-16 20:03:00) [9]

Теперь пытають клиентом отправить текст сообщ с пом. 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;
(смотрел в трейсе)


zsv   (2009-12-16 14:23:00) [10]

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


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

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

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

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


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

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

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


zsv   (2009-12-16 14:10:00) [13]

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


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

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


zsv   (2009-12-16 14:05:00) [15]

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


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

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо