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

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

Глюк компонента TIdUDPServer в 10м Indy? Проверьте ктонибудь. [D7, WinXP]


Страницы:   1 2

sniknik ©   (2007-09-14 23:48:00) 

Сделал небольшие изменения в старой, рабочей проге, с использованием 9х Indy, а с того времени уже поставил 10е... и словил глюк...
Вот интересно это только у меня так, возможно я чтото не учитываю (новые настройки например), или это глюк самого Indy?

Код проги приводить не буду, вместо этого выделил глюк в отдельный тест-пример (ниже), все задано в рантайме, и в одном месте, чтобы было нагляднее, на самом деле это в разных программах (и клиентская часть не моя), интересует серверная часть.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, IdGlobal,
 IdSocketHandle, StdCtrls, IdUDPClient;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   Button1: TButton;
   Button2: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   i1, i2: integer;
   UDPServer: TIdUDPServer;
   UDPClient: TIdUDPClient;
   procedure UDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.UDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
begin
 Memo1.Lines.Add(PChar(AData));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 UDPServer:= TIdUDPServer.Create(self);
 with UDPServer.Bindings.Add do begin
   IP  := '0.0.0.0';
   Port:= 2500;
 end;
 with UDPServer.Bindings.Add do begin
   IP  := '0.0.0.0';
   Port:= 2501;
 end;
 UDPServer.OnUDPRead:= UDPRead;
 UDPServer.Active:= true;

 UDPClient:= TIdUDPClient.Create(self);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Inc(i1);
 UDPClient.Send('127.0.0.1', 2500, '2500 '+IntToStr(i1));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 Inc(i2);
 UDPClient.Send('127.0.0.1', 2501, '2501 '+IntToStr(i2));
end;

end.


Как видно для прослушки устанавливаются 2 порта (минимум для глюка, больше будет тоже, а 1 нормально работает).
Выражается в том, что сервер не получает второе сообщение если если посылать два и более подряд на один порт. Т.е. его "клинит", "расклинивается" нажатием на другую кнопку (посылкой на другой порт) но тогда начинает задваиваться с первым... но через какоето время если жать опять только один и его "клинит".

В общем потыкайте в кнопки, в приведенной программке, адекватное поведение получается?
(indy должен быть 10, в 9ке это точно работало)
И можно ли это исправить? (В смысле сделать нормально, а не "залечкой" типа вместо одного 2(/3...n) компонента поставить с одним портом)


Сергей М.   (2007-09-17 08:34:00) [21]


> начинает задваиваться


Это как понимать ?


sniknik   (2007-09-16 21:59:00) [22]

Сорри, надо заменить
GetMem(Buf, Ln +1);


sniknik   (2007-09-16 21:55:00) [23]

ThreadedEvent  по умолчанию false (не думаю что в 9ке отличается), и как видно в коде он не меняется, а обработчик OnUDPRead вызывается в UDPRead так
procedure TIdUDPListenerThread.Run;
...
     if FServer.ThreadedEvent then begin
       UDPRead;
     end else begin
       Synchronize(UDPRead);
     end;
...

Т.е. работать должен. (хотя это и не рабочий код а пример где убрано все для выделения глюка)
В 9-ке, посмотрел файл, данные строки те же

Но вообще это отступление от темы, не нравится игнорирование потока измени так
const
 WM_MEMO_ADD = WM_USER+101;

 ....
 procedure MemoAdd(var Mess: TMessage); message WM_MEMO_ADD;
 ....

procedure TForm1.MemoAdd(var Mess: TMessage);
var
 Buf: PChar;
begin
 Buf:= Pointer(Mess.WParam);
 Memo1.Lines.Add(Buf);
 FreeMem(Buf);
end;

procedure TForm1.UDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
var
 Ln: integer;
 Buf: PChar;
begin
 Ln:= Length(AData);
 GetMem(Buf, Ln);
 Move(AData[0], Buf^, Ln);
 Buf[Ln]:= #0;
 PostMessage(Handle, WM_MEMO_ADD, integer(Buf), 0);
end;


Это ничего(в смысле описанного глюка) не меняет.


Сергей М.   (2007-09-16 11:12:00) [24]

Не знаю как в 10-ке, но и в 9-ке этоткод нормально работать не должен, ибо обрабортчик OnUDPRead в 9-ке вызывается в дополнительномпотоке.


Страницы:   1 2

Наверх

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