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;