首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

IdUDPServer有关问题

2012-03-03 
IdUDPServer问题Delphi(Pascal) codeTTest class(TComponent)privateFIdUDPServer: TIdUDPServerpublic

IdUDPServer问题

Delphi(Pascal) code
  TTest = class(TComponent)  private    FIdUDPServer: TIdUDPServer;  public    constructor create(AOwner: TComponent); override;    destructor Destroy; override;    procedure Active(Port: Integer);  end;{ TTest }procedure TTest.Active(Port: Integer);begin  FIdUDPServer.DefaultPort := Port;  FIdUDPServer.Active := True;end;constructor TTest.create(AOwner: TComponent);begin  inherited;  FIdUDPServer := TIdUDPServer.Create(self);  FIdUDPServer.BufferSize := 4096;  FIdUDPServer.ThreadedEvent := True;end;destructor TTest.Destroy;begin  if Assigned(FIdUDPServer) then  begin    FIdUDPServer.Active := False;    FIdUDPServer.Free;  end;  inherited;end;


//调用后,关闭窗体会出现 socket Error #10093的错误

Delphi(Pascal) code
procedure TForm1.Button5Click(Sender: TObject);begin  FSerTest := TTest.create(nil);  FSerTest.Active(23323);end;

在网上查找10093错误解释:應用程式沒有呼叫WSAStartup()或是呼叫WSAStartup()失敗。應用程式要成功地呼叫WSAStartup()才能使用WinSock.DLL,否則會有此錯誤訊息出現。


这个到底是啥问题呀

[解决办法]
inherited Destroy();

释放完自定义的内容
继承父类的释放
[解决办法]
FIdUDPServer := TIdUDPServer.Create(nil);
-----------------------------

type
TSocketSvr = class
FIdUDPServer: TIdUDPServer;
private
procedure UDPServerRead(AThread: TIdUDPListenerThread; AData: TBytes;ABinding: TIdSocketHandle);
procedure SetTransPort(const Value: UINT);
function GetActived: boolean;
procedure SetActived(const Value: boolean);
public
constructor Create;
destructor Destroy;
published
property TransPort: UINT read FTransPort write SetTransPort;
property Actived: boolean read GetActived write SetActived;
end;

constructor TSocketSvr.Create;
begin
try
FIdUDPServer := TIdUDPServer.Create(nil);
FIdUDPServer.DefaultPort := 3000;
FIdUDPServer.OnUDPRead := UDPServerRead; //我用XE OnUDPRead 事件与泛型有冲突,只能引用事件
FIdUDPServer.ThreadedEvent := true; //如果为FALSE 监听不到事件
except
end;
end;

destructor TSocketSvr.Destroy;
begin
FIdUDPServer.Active := false;
FIdUDPServer.Bindings.Clear;
FIdUDPServer.Free;
SocketSvr := nil;
end;

procedure TSocketSvr.UDPServerRead(AThread: TIdUDPListenerThread;AData: TBytes; ABinding: TIdSocketHandle);
begin
try
if not AThread.Terminated then
begin
//处理数据......
Sleep(LockDelay);
end;
finally
mySocketProcesser.Free;
end;
end;

热点排行