Zjištění dostupnosti sítě a cílového umístění na síti

Autor Téma: Zjištění dostupnosti sítě a cílového umístění na síti  (Přečteno 1632 krát)

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 115
  • Karma: 0
Dobrý den,

mohl bych se zeptat, zda li by někdo neznal lepší (a hlavně rychlejší) způsob jak zjistit, že je síť, respektive cílové umístění na síti dostupné?

V aplikaci přistupuji do sdílených složek umístěných na síti. V případě, že je cílová složka dostupná, je vše v pořádku. Jakmile ale cílový počítač vypnu, stane se složka na síti nedostupná. To způsobí zamrznutí aplikace na několik desítek vteřin (doba je různá, záleží asi na typu sítě). Z cílové složky načítám jeho obsah pomocí FindFirst a dostupnost zjišťuje pomocí DirectoryExists.

Zamrznutí aplikace je "prý" způsobeno Windows. Napadlo mě, že bych mohl zkusit požadavek na zjištění existence cílové složky vložit do samostatného vlákna a v případě, že do tří vteřin nedostanu odpověď, bych vlákno zrušil.

Možná ale existuje jiné, lepší řešení. Nějaká rada?

Díky!
AG   

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 218
  • Karma: 11
    • Verze Delphi: FPC :D
Pingnout danou masinu ? (ping by mel byt velmi rychly a staci ti jedna odpoved. Jakmile prijde pustis svou metodu, kdyz neprijde treba x pingu, tak ji ani nepustis. Zapasil jsem s tim taky.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 115
  • Karma: 0
Ping nebude úplné řešení, jelikož může být cílové umístění formou namapované jednotky. V některých případech se IP adresu (název hostitele) nedozvím.

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 218
  • Karma: 11
    • Verze Delphi: FPC :D
To by melo nejak jit zjistit - tu maplou jednotku. Nevim jestli by sel resit nejakej timeout u smb komunikace.

Mozna zkusit http://www.chami.com/tips/delphi/112896D.html (netestovano, jen zkouska).

Kazdopadne tohle reseni bude rychly.
« Poslední změna: 08-09-2016, 09:52:08 od raul »
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 115
  • Karma: 0
Mapovací jednotky lze zjistit přes "net use". Na netu nacházím vesměs jediné řešení - použití vlákna s timeoutem.

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 115
  • Karma: 0
Tak jsem vyzkoušel spustit DirectoryExists ve vláknu s timeoutem. Po vypršení času jsem schopný rychleji vyhodnotit, že je síťová složka nedostupná, ALE jelikož původní proces ve Windows stále běží, tak je zaseknutá jakákoliv práce s diskem (i lokálním). Toto řešení tedy není úplně v pořádku ...

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 218
  • Karma: 11
    • Verze Delphi: FPC :D
Porad se nabizi ping - jo, je to vic prace, a jo, pouziti bude jednodussi. Killovat (ci ignorovat nedobehle) nejaky vlakno - spesl vlakno, ktere zavisi na windows funkcich - bych fakt nedelal.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 432
  • Karma: 17
    • Verze Delphi: D2007, XE3
Hmm, pekne to vyriesil v niektorej z poslednych verzii Christian Ghisler vo svojom Total Commandery. Neviem ako to urobil ale ked sa TC snazi pristupovat na nejake sietove miesto a to sa mu nepodari otvorit behom nejakeho kratkeho timeoutu tak TC vyhodi hlasku v ktorej mi umozni otvaranie daneho miesta prerusit alebo vyckat na dokoncenie poziadavky. Funguje mi to spolahlivo a elegantne, nic sa nezasekuje, nic nemrzne. Svojho casu mi Christian Ghisler osobne odpovedal na niekolko emailov. Skus mu napisat, mozno odpovie aj tebe a potom sa nam tu s vysledkom podel...

Online pf1957

  • Padawan
  • ******
  • Příspěvků: 2165
  • Karma: 116
    • Verze Delphi: D2007, XE3, DX10
Excellent
Rated 1 time
Tak jsem vyzkoušel spustit DirectoryExists ve vláknu s timeoutem. Po vypršení času jsem schopný rychleji vyhodnotit, že je síťová složka nedostupná, ALE jelikož původní proces ve Windows stále běží, tak je zaseknutá jakákoliv práce s diskem (i lokálním). Toto řešení tedy není úplně v pořádku ...
Co jsem se dival na SO, tak to navrhuji resit
1. spustenim prikazu NET USE a parsovanim jeho vystupu
2. pres WMI https://msdn.microsoft.com/en-us/library/windows/desktop/aa394194(v=vs.85).aspx nebo asi lepe https://msdn.microsoft.com/en-us/library/windows/desktop/aa394592(v=vs.85).aspx
« Poslední změna: 08-09-2016, 18:09:00 od pf1957 »

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 447
  • Karma: 36
    • Verze Delphi: 10.2
Ping, který tu je zmíněn, bych nedoporučoval. Jednak se nemusí podařit převést název serveru na IP adresu (třeba u mě je \\NOVELL\Neco, ale nslookup NOVELL vrátí non-existent domain). Krom toho stroj, ze kterého je disk připojený, ani nemusí na ping reagovat, ve Windows je odpovídání na ping už dlouho ve výchozím stavu zakázané.

Offline raul

  • Plnoletý
  • ***
  • Příspěvků: 218
  • Karma: 11
    • Verze Delphi: FPC :D
Re:Zjištění dostupnosti sítě a cílového umístění na síti
« Odpověď #10 kdy: 09-09-2016, 21:12:37 »
nslookup snad hleda v dns serverech, a tudiz nebude hledat v mistni siti apod. jinak souhlas, nemusi to chodit, ale o lepsim reseni nevim. mozna bude nekde v registrech nejakej timeout k nastaveni.
Lazarus 1.6.3:), FPC, Intel/Arm, Windows/Linux

Offline bzaujec

  • Nováček
  • *
  • Příspěvků: 1
  • Karma: 1
    • Verze Delphi: XE7, XE10
Re:Zjištění dostupnosti sítě a cílového umístění na síti
« Odpověď #11 kdy: 13-09-2016, 11:33:13 »
My to zisťujeme v threade:

Kód: Delphi [Vybrat]
  1. unit UnitTimeoutSupport;
  2.  
  3. interface
  4.  
  5. uses System.SysUtils;
  6.  
  7. function Timeouted(const AInterval: Cardinal; AProc: TProc): Boolean;
  8.  
  9. implementation
  10.  
  11. uses System.Classes, Winapi.Windows;
  12.  
  13. type
  14.   TTimeoutThread = class(TThread)
  15.   protected
  16.     FProc: TProc;
  17.     FExecuted: Boolean;
  18.   public
  19.     constructor Create(AProc: TProc); overload;
  20.     procedure Execute; override;
  21.   end;
  22.  
  23. function Timeouted(const AInterval: Cardinal; AProc: TProc): Boolean;
  24. var
  25.   _timeoutThread: TTimeoutThread;
  26.   _threadHandle: NativeUInt;
  27.   _waitResult: Cardinal;
  28. begin
  29.   _timeoutThread := TTimeoutThread.Create(AProc);
  30.   _threadHandle := _timeoutThread.Handle;
  31.   _timeoutThread.Start;
  32.   _waitResult := WaitForSingleObject(_threadHandle, AInterval);
  33.   Result := (_waitResult = WAIT_TIMEOUT) or (_waitResult = WAIT_FAILED) or
  34.     (_waitResult = WAIT_ABANDONED);
  35. end;
  36.  
  37. { TTimeoutThread }
  38.  
  39. constructor TTimeoutThread.Create(AProc: TProc);
  40. begin
  41.   inherited Create(True);
  42.   FProc := AProc;
  43.   FreeOnTerminate := True;
  44. end;
  45.  
  46. procedure TTimeoutThread.Execute;
  47. begin
  48.   inherited;
  49.   try
  50.     if not Terminated then
  51.       FProc();
  52.   except
  53.     // do nothing
  54.   end;
  55. end;
  56.  
  57. end.
  58.  

a používame to
Kód: Delphi [Vybrat]
  1.               _dirExists := False;
  2.               Timeouted(DirExistsTimeout,
  3.               procedure begin
  4.                 _dirExists := DirectoryExists(server_dir);
  5.               end);
  6.               if _dirExists then
  7. ...
  8.  
DirExistsTimeout je konštanta, koľko sekúnd má trvať testovanie, "server_dir" je adresár, ktorého existencia sa testuje
 

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: