Главная страница
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.136 c
15-1334559279
Медвежонок Пятачок
2012-04-16 10:54
2013.03.22
pptp через openVpn


15-1340314077
ZV
2012-06-22 01:27
2013.03.22
Компонент Async32 не работает в С++


2-1331397815
crank
2012-03-10 20:43
2013.03.22
Выбор БД


15-1332614719
wl
2012-03-24 22:45
2013.03.22
Про коньяк на др. Дубль 2


15-1353837763
dummy_user
2012-11-25 14:02
2013.03.22
Вставка текста из .pas в .txt.