16.05.2011, 14:17
|
Новичок
|
|
Регистрация: 17.09.2010
Адрес: Беларусь, г. Минск
Сообщения: 58
Версия Delphi: 7, 2010,XE
Репутация: 10
|
|
Вот врое как сам пытаюсь..
Код:
unit CheckServerUnit;
interface
uses IdSocketHandle,IdUDPServer,SysUtils,Windows,StdCtrls,Classes;
type
TServerCheckEvent = class(TObject)
public
Result:Boolean;
hEvent:THandle;
constructor create;
destructor Destroy; override;
procedure OnUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
end;
function CheckServer(aHost:string; aPort:Integer; Seconds:Integer):Boolean;
implementation
var
hEvent:THandle;
function CheckServer(aHost:string; aPort:Integer; Seconds:Integer):Boolean;
var
UDP:TIdUDPServer;
Data:array of Char;
s:string;
CS:TServerCheckEvent;
ms:DWORD;
begin
Result:=False;
if (aHost = '') or (aPort > 35555) or (aPort <= 0) or (ms <= 0) then
Exit;
UDP:=TIdUDPServer.Create(nil);
CS:=TServerCheckEvent.create;
UDP.DefaultPort:=35555;
try
UDP.OnUDPRead:=CS.OnUDPRead;
ms:=Seconds*1000; //miliseconds
s:=#255#255#255#255'TSource Engine Query'#0;
SetLength(data, Length(s));
StrPCopy(@data[0], s);
UDP.SendBuffer(aHost, aPort, data[0], Length(data));
if (WaitForSingleObject(hEvent,ms) = WAIT_OBJECT_0) then
begin
Result:=True;
end else
Result:=False;
finally
FreeAndNil(UDP);
CS.Destroy;
end;
end;
{ TServerCheckEvent }
constructor TServerCheckEvent.create;
begin
//Создаём событие
hEvent:=CreateEvent(nil,True,False,nil);
end;
destructor TServerCheckEvent.Destroy;
begin
//закрываем
CloseHandle(hEvent);
inherited;
end;
procedure TServerCheckEvent.OnUDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
c:Char;
s:string;
begin
while AData.Read(c, 1)<>0 do if (c>=#32) and (c<=#255) then s:=s+c;
If(s = '') then
ResetEvent(hEvent)
else
SetEvent(hEvent);
end;
но всегда false а в процедуру UDPRead даже не переходит... что делаю не так?
|