![]() |
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:
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.
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; |
AW: Bestimmte Geräte im Netzwerk suchen
Das Problem wird sein, dass
Delphi-Quellcode:
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
Delphi-Quellcode:
aufrufen, bis du ein gewisses Timeout überschritten hast.
ReceiveBuffer
Hierzu würde ich
Delphi-Quellcode:
nur ganz kurz blockieren lassen (also den zweiten Parameter von -1 auf 10 oder sowas ändern) und dann nach jeder Iteration per
ReceiveBuffer
Delphi-Quellcode:
prüfen, wie viel Zeit seit dem Begin der Schleife vergangen ist, um nach einer von dir definierten Zeit abzubrechen.
GetTickCount
|
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 08:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz