Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Bestimmte Geräte im Netzwerk suchen (https://www.delphipraxis.net/190845-bestimmte-geraete-im-netzwerk-suchen.html)

Puddy 13. Nov 2016 23:56


Bestimmte Geräte im Netzwerk suchen
 
Hallo,

ich möchte in einer Listview alle Geräte im Netzwerk anzeigen, die auf eine Broadcast Nachricht antworten.

Als ersten Schritt wollte ich alle Antworten in einem Memo anzeigen.

Mein Problem ist: Nur das Gerät mit der ersten Antwort wird angezeigt. In Wireshark sehe ich, dass die Nachricht wie gewünscht gesendet wird und alle Geräte wie erwartet antworten. Stimmt da was mit den Bindings nicht? Muss ich den Buffer anders benutzen?

Ich benutze Delphi 10 und die Indys 10.6.2.5298

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Client: TIdUDPClient;
  lenUDP : integer;
begin
  Memo1.Lines.Add('new');

  Client := TIdUDPClient.Create(nil);
  try
    Client.Host := '192.168.178.255';
    Client.Port := 22004;
    Client.BroadcastEnabled := True;
    client.Send('PING');

    Client.ReceiveTimeout := 5000;
    SetLength(myBuf, client.BufferSize);
    lenUDP := client.ReceiveBuffer(myBuf, -1);

    memo1.Lines.Add(inttostr(lenUDP));
    if lenUDP > 0 then begin
      SetLength(myBuf, lenUDP);
      memo1.Lines.Add(bytestostring(mybuf))
    end;
  finally
    Client.Free;
  end;
end;
Und: Wäre es besser stattdessen den UDPServer zu benutzen? Soweit ich das sehe kann ich damit nicht bestimmen über welches Netzwerk Interface der Broadcast gesendet wird. Ebenfalls habe ich noch keine Information gefunden, welcher Broadcasttyp hier benutzt wird. Ich möchte lieber mit directed Broadcast arbeiten, weil der limited Broadcast von den Routern blockiert wird und ich die Netzwerk Topologie im Regelfall nicht kenne.

Zacherl 14. Nov 2016 03:21

AW: Bestimmte Geräte im Netzwerk suchen
 
Das Problem wird sein, dass
Delphi-Quellcode:
ReceiveBuffer
nur so lange blockiert, bis die erste Antwort bei dir angekommen ist. Um alle Antworten zu erhalten, müsstest du selbstständig in einer Schleife immer wieder
Delphi-Quellcode:
ReceiveBuffer
aufrufen, bis du ein gewisses Timeout überschritten hast.

Hierzu würde ich
Delphi-Quellcode:
ReceiveBuffer
nur ganz kurz blockieren lassen (also den zweiten Parameter von -1 auf 10 oder sowas ändern) und dann nach jeder Iteration per
Delphi-Quellcode:
GetTickCount
prüfen, wie viel Zeit seit dem Begin der Schleife vergangen ist, um nach einer von dir definierten Zeit abzubrechen.

Puddy 14. Nov 2016 19:59

AW: Bestimmte Geräte im Netzwerk suchen
 
Danke. Genau das hat mir gefehlt. Funktioniert, ich werde es aber noch länger testen müssen.

Für die Nachwelt:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Client : TIdUDPClient;
  lenUDP : integer;
  startTime : Cardinal;
begin
  Memo1.Lines.Add('start');

  Client := TIdUDPClient.Create(nil);
  try
    Client.Host := '192.168.178.255';
    Client.Port := 22004;
    Client.BroadcastEnabled := True;
    Client.ReceiveTimeout := 3000;

    Client.Send('PING');
    startTime := GetTickCount;

    SetLength(myBuf, Client.BufferSize);

    while (GetTickCount - startTime) < 3500 do begin
      lenUDP := Client.ReceiveBuffer(myBuf, 10);

      if lenUDP > 0 then begin
        Memo1.Lines.Add(inttostr(lenUDP));
        SetLength(myBuf, lenUDP);
        Memo1.Lines.Add(bytestostring(mybuf));
      end;
    end;
  finally
    Memo1.Lines.Add('end');
    Client.Free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz