![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк компонента TIdUDPServer в 10м Indy? Проверьте ктонибудь. [D7, WinXP]
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-ке вызывается в дополнительномпотоке.