![]() |
Mehrere IP-Adressen auf einem Rechner -für Simulationszwecke
Ich bin gerade dabei, eine Simulation zu planen, die in der Lage sein sollte eine beliebige Anzahl von "externen" Geräten zu simulieren. Im Realfall hat jedes Gerät natürlich eine eigene IP-Adresse und lauscht auf einem fix reservierten Port. Um die Geräteentwicklung von der Entwicklung der PC-Applikation(en) zu trennen (in der Regel sind auch nie genügend physikalische Geräte vorhanden) soll es ein Programm geben, das auf einem PC läuft und eine beliebige Anzahl von pyhsikalischen Geräten simulieren kann (natürlich jedes mit eigener IP, alle am selben Port ...).
Auf den Geräten wird ausschließlich UDP verwendet und die Simulation sollte in Delphi mit den Indy10 Komponenten geschrieben werden. Nun habe ich aber das Problem, das ich keine Ahnung habe, wie ich auf einem Rechner eine beliebige Anzahl von IP-Adressen simulieren kann? TIA Whookie |
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
beim tcp/ip-protokoll in den Eigenschaften einer Verbindung kannst du mehrere IP-Adressen angeben.
|
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
Unter WinXP und vielleicht auch Win2000 kannst Du bei den Netzwerkeinstellungen mehrere IP-Adressen eintragen. Natürlich geht das nicht unendlich.
Evtl. solltest Du Dir auch mal überlegen, mit VM's zu arbeiten. Dann hast Du mehrere PC's auf einem PC. |
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
Das ganze sollte ziemlich einfach in einem Simulationsprogramm laufen, dort sollten 20 bis 50 Geräte (== IP-Adressen) simuliert werden können. Das ganz könnte dann auf einem eigenen "Simulationsrechner" oder besser noch auf dem Entwicklungsrechner selber laufen, auf dem die Applikation entwickelt wird.
|
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
Wenn es dir nur um IP Adressen geht hast du doch sicher genug. Man denke nur an 127.0.0.1. Damals zu beginn von IP haben die Erfinder gleich das komplette A Netz 127 als Lokal gesetzt. Also hat dein Rechner auch die Adresse 127.8.9.10. Ich denk mal so 16 Mio. Adressen sollten dir reichen.
mfg, Björn |
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
Ja, ich denke das sollte für meine Zwecke genügen :lol:
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:
Dazu gibt es auch noch einen Broadcast-Button:
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;
Delphi-Quellcode:
Bewusst momentan nicht drin ist das warten auf eine Antwort....
procedure TSDIAppForm.BroadCastBtnClick(Sender: TObject);
begin IdUDPClient1.Active := TRUE; IdUDPClient1.BroadcastEnabled := TRUE; IdUDPClient1.Broadcast('Broadcasting to all <Hallo Welt>!', 3333); end; Dann gibt es eine Serverapplikation die momentan 2 IdUDPServer-Komponenten enthält. Beide wurden wie folgt initialisiert (im Designer):
Delphi-Quellcode:
Der Rest bleibt auf Defaultwerten. Das OnUDPRead-Ereignis beider Komponenten ist mit folgender Methode verbunden:
Active := TRUE;
BroadcastEnabled := TRUE; DefaultPort:=3333; Bindings := 127.8.0.4:3333 (IdUDPServer1) Bindings := 127.8.0.5:3333 (IdUDPServer2)
Delphi-Quellcode:
dbPrint gibt dabei Text in ein Memofeld aus.
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; 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 |
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
Hallo,
WinXP: genau 2 IP Adressen kannst du da eingeben, eine originäre und eine alternative. Alles andere ist fundiertes Halbwissen! Grüsse Rainer |
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
<Eigenschaften der Netzwerkverbindung> - Eigenschaften von Internetprotokoll (TCP/IP) - <DHCP deaktivieren> - Erweitert - IP-Adressen - Hinzufügen
Auszug aus der Hilfe dieses Dialogs: Listet zusätzliche IP-Adressen und Subnetzmasken auf, die dieser Netzwerkverbindung zugewiesen werden können. Sie können beliebig viele IP-Adressen konfigurieren. [...] Hm. Klingt fast wie gewollt. Gruß Stephan |
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
:( damit hab ich leider kein Glück ... XP meint bei der Eingabe einer 127.er IP:
IP-Adressen, die mit 127 beginnen, sind unzulässig, weil sie für Loopbackadressen reserviert sind. Geben sie einen anderen Wert zwischen 1 und 223 ein. Mal abgesehen davon, dass das ein ziemlicher Konfigurationsaufwand wäre ... bei jedem Rechner 50 IP-Adressen einzugeben damit die Simulation läuft ... Ausserdem läuft es ja mit den IdUDPServer(n), wenn man über Bindings eine entsprechende Zuweisung macht (zumindestens der Empfang) ... vielleicht krieg ich da ja doch noch irgendwie die Kurve? |
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
Hallo, das ist ne entweder-oder-sache ;-)
1. du bindest deine adapter an loopback-adressen, z.B. 127.0.1.32 2. du bindest deinen Nertzerkadapter an mehrere bestimmte Adressen, z.B. 10.0.0.1,10.0.0.2,10.0.0.3 usw. du kannst deine netzwerkadapter dann auch einzeln an diese adressen binden. Soweit hab ichs verstanden. |
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
loopback-adressen (127.*) kann man imho nicht binden, sie werden intern an 127.0.0.1 weitergeleitet. jedoch gabs unter WinXP mal einen "Bug", der nur eine begrenzte Anzahl von loopback-Adressen akzeptierte (glaube 127.0.0.1-127.0.0.6). dafür gibts aber einen Patch von MS:
![]() spätestens nach einspielen des Patches sollten sich alle 127er IPs anpingen lassen (antwort von 127.0.0.1) für dein problem musst du wohl einen eigenen IP-Bereich aufbauen, wie steve schon geschrieben hat. über die registry geht das bisschen schneller: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\{ 9D98BF32-BD94-4708-937C-A079C7125F52}\Parameters\Tcpip IPAddress => IPs mit Zeilenumbruch getrennt SubnetMask => passende Subnetmasks dazu HTH Frank |
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
Hallo,
Zitat:
Gruß xaromz |
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
Ja, das mit dem Binden der 127.* geht wirklich nicht. Die Lösung (für mich) ist es den Microsoft Loopbackadapter zu installieren. Damit ist es dann möglich IP-Adressen hinzuzufügen (geht natürlich auch mit der physikalischen Karte ... aber bei mir war dann plötzlich Schluß mit surfen) und diese einzeln oder im Broadcast anzusprechen.
Einziger Wermutstropfen, der Loopbackadapter lässt sich in Tools wie dem ![]() |
Re: Mehrere IP-Adressen auf einem Rechner -für Simulationszw
Für alle die es interessiert (und weil ich eine Eeewigkeit gebraucht habe um das rauszukriegen) gibts hier eine Funktion, die herausfindet, ob der Loopback Adapter bereits installiert ist. Getestet habe ich das ganze allerdings nur auf Windows XP (+SP2), wenn also jemand Lust hat und das auch auf was anderem zum Laufen kriegt, kann er ja hier seine Erfahrungen posten!
Um den Code kompilieren zu können, ist die Unit "SetupApi" aus den Jedis nötig und da musste ich {.DEFINE SETUPAPI_LINKONREQUEST} einstellen um keinen Crash zu verursachen...
Delphi-Quellcode:
Function LoopBackInstalled: Boolean;
Var pDevInfo: HDEVINFO; DevInfoData: SP_DEVINFO_DATA; RegDataType: Cardinal; PropSize: Cardinal; pPropBuffer: PByte; i: Integer; p: PChar; begin Result := FALSE; // Annahme: Nix installiert pDevInfo := SetupDiGetClassDevs(NIL, NIL, 0, DIGCF_ALLCLASSES Or DIGCF_PRESENT); if DWord(pDevInfo) <> INVALID_HANDLE_VALUE then begin // suche nach dem loopback adapter DevInfoData.cbSize := SizeOf(DevInfoData); i := 0; while SetupDiEnumDeviceInfo(pDevInfo, i, DevInfoData) And Not Result Do // schlägt fehl wenn was nicht passt oder i>Devices ist Begin pPropBuffer := NIL; PropSize := 0; // 1. Aufruf um die Buffergröße herauszufinden SetupDiGetDeviceRegistryProperty(pDevInfo, DevInfoData, SPDRP_HARDWAREID, RegDataType, pPropBuffer, PropSize, PropSize); If GetLastError = ERROR_INSUFFICIENT_BUFFER Then Begin GetMem(pPropBuffer, PropSize); // 2. Aufruf um die Daten zu holen If SetupDiGetDeviceRegistryProperty(pDevInfo, DevInfoData, SPDRP_HARDWAREID, RegDataType, pPropBuffer, PropSize, PropSize) Then Begin // ok pPropBuffer durchsuchen ... p := PChar(pPropBuffer); while p^ <> #0 do begin if CompareText(p, '*msloop')=0 then begin Result := TRUE; Break; end; p := p + Length(p)+1; end; End; // Eventuell keine Daten vorhanden ...? FreeMem(pPropBuffer); end; Inc(i); End; SetupDiDestroyDeviceInfoList(pDevInfo); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:18 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