Показать сообщение отдельно
  #14  
Старый 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 даже не переходит... что делаю не так?
Ответить с цитированием