Главная страница
    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.062 c
15-1347827405
Юрий
2012-09-17 00:30
2013.03.22
С днем рождения ! 17 сентября 2012 понедельник


9-1192415932
Баклан
2007-10-15 06:38
2013.03.22
Где бы накачать интересных уровней для сокобана?


15-1328646602
Юрий
2012-02-08 00:30
2013.03.22
С днем рождения ! 8 февраля 2012 среда


2-1334905984
Sa1exn
2012-04-20 11:13
2013.03.22
Изменение шрифта для форм


15-1336227120
KilkennyCat
2012-05-05 18:12
2013.03.22
TImage - мини-фотошоп





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