Newsgroup: it.comp.lang.delphi
Titolo: Visualizzazione pc in rete

Ciao a tutti,
   ho un piccolo problema che si e' poi trasformato in curiosita' che sto 
cercando (invano) di capire.
Per avere una lista dei computer in rete uso questa funzione (onestamente in 
rete ci sono decine e decine di versioni)
riportata alla fine del messaggio.
Quello che mi lascia un po "incuriosito" e' la casualita' di oggi.
Rete con 9 pc con questi nomi
Server
client1 . . . client8
 
Prima di oggi (mha) la funzione lavorava bene, ovvero mi restituiva i 9 
nomi.
Non so cosa e' successo .... oggi ne restituisce 8, client3 e' sparito dalla 
lista (ma connesso).
Cosi' ho provato ad aprire esplora risorse (sul alcuni pc "computer") e ho 
clicclato sull'icona RETE.
Ebbene anche li mostra 8 pc in rete, client3 non e' visualizzato .... ma 
dopo 2-4 secondi ..., magicamente, appare.
 
Domanda: perche' appare in eplora risporse (anche se con ritardo) e non 
appare nella lista restituita dalla funzione sotto riportata?
 
Grazie per le eventuali risposte
Ciao
Daniele
 
PS: Ho anche provato ad usare tutte le RESOURCETYPE_* e ho provato a 
cambiare i vari RESOURCE_*, ma client3 non comapre.
 
function FindAllComputers(Workgroup: string; WithIP: Boolean): TStringList;
var
  EnumHandle : THandle;
  WorkgroupRS : TNetResource;
  Buf : Array[1..500] of TNetResource;
  BufSize : cardinal;
  Entries : cardinal;
  Res : Integer;
  Computers : Tstringlist;
  Limit, I: Integer;
begin
  Limit := 0;
  Workgroup := Workgroup + #0;
  FillChar(WorkgroupRS, SizeOf(WorkgroupRS) , 0);
  With WorkgroupRS do
  begin
    dwScope := 2;
    dwType := 3;
    dwDisplayType := 1;
    dwUsage := 2;
    lpRemoteName := @Workgroup[1];
  end;
  WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0,
    @WorkgroupRS, EnumHandle);
  Computers := TStringList.Create;
  repeat
    Entries := 1;
    BufSize := SizeOf(Buf);
    Res := WNetEnumResource(EnumHandle, Entries, @Buf, BufSize);
    if (Res = NO_ERROR) and (Entries = 1) then
    begin
      Computers.Add(StrPas(Buf[1].lpRemoteName));
    end;
    Inc(Limit);
  until (Res <> NO_ERROR) or (Limit > 100);
  WNetCloseEnum( EnumHandle );
  if WithIP then
  begin
   (* for I := 0 to Computers.Count-1 do
      Computers[I] := Computers[I] + '=' + GetIP(Computers[I]); *)
  end;
  Result := Computers;
end;
 

 appare nella lista restituita dalla funzione sotto riportata?
 
Perche` la scoperta delle risorse di rete non e` necessariamente 
sincrona. La tua funzione viene chiamata una sola volta e restituisce 
uno snapshot delle risorse in quel momento. Prova a spostare quel codice 
su un thread parallelo, dove viene eseguito a certi intervalli (non 
troppo brevi) e un listener su thread principale che ascolta per gli 
aggiornamenti.
 
--
4ndre4

 dopo 2-4 secondi ..., magicamente, appare.
 
evidentemente la risposta di client3 arriva in ritardo rispetto agli altri
 
 > until (Res <> NO_ERROR) or (Limit > 100);
 
prova ad aumentare Limit > 150
 
 
-- 
Oggi c'e' una grande battaglia di idee,
ma alla fine non ci saranno ne vinti,
ne vincitori, ne idee! S. Benni da Elianto.

Ciao a tutti,
  spento e riacceso 3 volte il client3, alla terza finalmente si vede ...
 
mha !
 
Ciao
Daniele

  spento e riacceso 3 volte il client3, alla terza finalmente si vede ...
 
E` solo un caso. Hai provato a cambiare il tuo codice come ti ho suggerito?
 
-- 
4ndre4

 suggerito?
 
Si ho apportato qualche modifica e fatto un paio di prove (al limite del 
buon senso).
Nella procedura dove visualizzo i pc in rete ho messo un timer dove ogni x 
secondi fa il rescan.
Ma la cosa interessante e' che il famoso client3 non viene visto da quella 
funzione (ma da espora risorse si)
solo in una condizione (e ti devo dire che ne ho provate di condizioni 
limiti) ovvero quando (per qualsiasi
motivo) il router della rete si spegne e poi si riaccende.
In questo caso (ultra limite) al riavvio tutta la rete si "ripristina" ma 
solo quel pc non si riallinea, o meglio, non viene visto
dalla funzione perche', comunque, e' connesso in rete.
Mi sono arreso davanti a questa situazione (in effetti se router si spegne 
per qualsiasi motivo, di norma, prima di riaccenderlo si spengono anche 
tutti gli altri pc) pero' rimane questa curiosita'.
 
Grazie per la dritta.
 
Ciao
 
Daniele 
 

Ti suggerisco di controllare il registro degli eventi di windows di quel particolare pc. Magari la scheda di rete ha qualche problema.
In seconda battuta, verificare se le impostazioni di rete sono uguali a quelle degli altri, fermo restando ovviamente (ma non per tutti) eventuali indirizzi IP fissi.
 
A.

Ciao Alberto

Come sempre ho seguito i tuoi preziosi consigli e, andando a spulciare la 
configurazione di tutti i pc, ho scoperto con mi grande sorpresa che i pc in 
rete (settati di guru dei sistemi, alias assistenza tecnica gestionale) 
erano impostati, come tipologia di rete, alla rinfusa.
Alcuni come rete domestica, altri come aziendale e 2 come pubblica.
Dato che i pc in rete sono ultra noti, ho impostato tutti i pc come rete 
aziendale e tutto e' andato a posto.
Ora, paradossalmente, ho il problema inverso ...... la funzione restituisce 
nella lista anche i computer spenti (come fa anche esplora risorse).
 
Almeno una e' sistemata !!!
 
Grazie per tutto.
 
Ciao, Daniele 
 

 aziendale e tutto e' andato a posto.
 
Ecco uno dei [rari] casi dove i sistemisti fanno le cose alla carlona e 
gli sviluppatori ne pagano le conseguenze..
 
(si, ho generalizzato, perchè è un problema noto e già discusso qui)
 
-- 
Morde

 
inviando un ping ai client 

> inviando un ping ai client
 
Non è una buona idea: molti sistemisti li bloccano.
 
A.
 

 gli sviluppatori ne pagano le conseguenze..
 
Noi sottovalutiamo i rischi, e spesso sono LORO a pagare.
E quindi molti di loro sono prevenuti.
 
Se lavorassimo insieme di comune accordo staremmo tutti piu' tranquilli e rilassati.
 
A.

da come descritta non sembrava una rete particolarmente sofisticata, ed in fondo fare una prova da riga di comando ci vuole un secondo, prima di implementarla sul codice 

 gli sviluppatori ne pagano le conseguenze..
 
Non e' per fumentare stati d'animo negativi ..... ma nel pomeriggio ho 
chiamato i signori che hanno in manutenzione gestionale + rete esponendo la 
condizione che ho trovato.
Ebbene loro ( perche' ho parlato con 2 persone) mi hanno risposto che 
(testuali parole) "pubblica, domestica, aziendale" non costituiscono un 
grande problema, quindi non mi devo preoccupare.
 
Se lo dicono loro .....
 
Ciao
 
Daniele 
 

 quindi non mi devo preoccupare.
 
Magari sono io a pensare male, ma ho la sensazione che in sintesi ti abbiano detto di farti i kazzi tuoi....
 
 
A.

 grande problema, quindi non mi devo preoccupare.
 
Eh no, qui si sbagliano: a seconda del network type, windows espone o 
meno il pc al discovery service. Se impostassi rete pubblica, il PC non 
sarebbe visibile agli altri.
La rete da impostare è work. Se proprio ti vuoi allargare, scegli home.
 
-- 
Morde