AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Bestimmte Geräte im Netzwerk suchen
Thema durchsuchen
Ansicht
Themen-Optionen

Bestimmte Geräte im Netzwerk suchen

Ein Thema von Puddy · begonnen am 14. Nov 2016 · letzter Beitrag vom 14. Nov 2016
Antwort Antwort
Puddy

Registriert seit: 2. Jun 2007
18 Beiträge
 
FreePascal / Lazarus
 
#1

Bestimmte Geräte im Netzwerk suchen

  Alt 14. Nov 2016, 00:56
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.

Geändert von Puddy (14. Nov 2016 um 03:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Bestimmte Geräte im Netzwerk suchen

  Alt 14. Nov 2016, 04:21
Das Problem wird sein, dass 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 ReceiveBuffer aufrufen, bis du ein gewisses Timeout überschritten hast.

Hierzu würde ich ReceiveBuffer nur ganz kurz blockieren lassen (also den zweiten Parameter von -1 auf 10 oder sowas ändern) und dann nach jeder Iteration per GetTickCount prüfen, wie viel Zeit seit dem Begin der Schleife vergangen ist, um nach einer von dir definierten Zeit abzubrechen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Puddy

Registriert seit: 2. Jun 2007
18 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Bestimmte Geräte im Netzwerk suchen

  Alt 14. Nov 2016, 20:59
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 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