Einzelnen Beitrag anzeigen

Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
441 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw

  Alt 8. Jul 2007, 21:56
Ja, ich denke das sollte für meine Zwecke genügen

Ich habe mich auch schon über einige Experimente her gemacht und bin bereits auf die nächsten Probleme gestoßen...

Ich habe ein Clientprogramm mit einer IdUDPClient-Komponente und einer ComboBox mit folgenden IP-Adressen: 127.8.0.4 und 127.8.0.5. Dazu gibt es 2 Buttons, einer davon verwendet die beiden IP's aus der ComboBox:

Delphi-Quellcode:
procedure TSDIAppForm.SendBtnClick(Sender: TObject);
begin
  IdUDPClient1.Active := TRUE;
  IdUDPClient1.Send(SendIPCB.Items[SendIPCB.ItemIndex], 3333, Format('Sending to %s <Hallo Welt!>', [SendIPCB.Items[SendIPCB.ItemIndex]]));
end;
Dazu gibt es auch noch einen Broadcast-Button:

Delphi-Quellcode:
procedure TSDIAppForm.BroadCastBtnClick(Sender: TObject);
begin
  IdUDPClient1.Active := TRUE;
  IdUDPClient1.BroadcastEnabled := TRUE;
  IdUDPClient1.Broadcast('Broadcasting to all <Hallo Welt>!', 3333);
end;
Bewusst momentan nicht drin ist das warten auf eine Antwort....

Dann gibt es eine Serverapplikation die momentan 2 IdUDPServer-Komponenten enthält. Beide wurden wie folgt initialisiert (im Designer):
Delphi-Quellcode:
Active := TRUE;
BroadcastEnabled := TRUE;
DefaultPort:=3333;

Bindings := 127.8.0.4:3333 (IdUDPServer1)
Bindings := 127.8.0.5:3333 (IdUDPServer2)
Der Rest bleibt auf Defaultwerten. Das OnUDPRead-Ereignis beider Komponenten ist mit folgender Methode verbunden:

Delphi-Quellcode:
procedure TSDIAppForm.UDPServer_Read(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
Var
  s: TIdBytes;
begin
  dbPrint('OnRead: %s("%s")', [TComponent(Sender).Name, BytesToString(AData)]);
  dbPrint(' IP: %s (Port: %d)', [ABinding.IP, ABinding.Port]);
  dbPrint(' PeerIP: %s (PeerPort: %d)', [ABinding.PeerIP, ABinding.PeerPort]);
// SetLength(s, 3);
// AppendString(s, '+OK', -1);
// ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s);
end;
dbPrint gibt dabei Text in ein Memofeld aus.

1. Problem
Verwende ich die Send-Funktion dann wird das UDPServer_Read-Ereignis korrekt ausgelöst. Drücke ich den Broadcast-Button, wird jedoch kein Ereignis ausgelöst.

2. Problem
Nehme ich die Kommentare im UDPServer_Read weg (sende also eine Antwort), bekomme ich die Fehlermeldung:
Socket Error # 10065 - No route to host. Natürlich bekomme ich auch im IdUDPClient ein Timeout, wenn ich dort mit
IdUDPClient1.ReceiveString; eine Antwort zu empfangen versuche ...

3. frage ich mich, ob das überhaupt klappen kann, wenn ein Broadcast antworten von mehreren Quellen bringt, ich aber nur auf dieses eine ReceiveString warte ...?

Vielleicht gibts ja jemand der da einwenig Licht in die ganze Sache bringen kann ...

TIA
Whookie
  Mit Zitat antworten Zitat