Seite 1 von 4
Netzwerkanwendung
Verfasst: 25.05.2015 21:52
von derschutzhund
Habe mir mal gerade wieder eine kleine Programmieraufgabe gesucht.
1. Ein PC soll alle IPs ermitteln die sich im gleichen Netz befinden:
also in etwa dieses Ergebnis liefern:
192.168.178.1
192.168.178.22
192.168.178.50
2. Dann sollte er seine eigene IP ermitteln
3. Da die IPs der NetzwerkPCs dynamisch vergeben werden muss ich irgendwie ermitteln welche IP zu
welchem PC gehört. Dazu befindet sich in jedem Verzeichnis eine Datei nr.txt in der die PCNr steht.
Wenn man im Browser des "ZentralPC" z.B. folgende Zeile eingibt
wird der Inhalt dieses Verzeichnisses angezeigt.
Auf allen PCs läuft unter Linux dieses Script: SimpleHTTPServerWithUpload.py
Für die weitere Verarbeitung würde ich die PCNr zusammen mit der jeweiligen IP in einer Liste sammeln
4. Als Option könnte ich mir noch eine Funktion vorstellen um alle Dateien aus allen Verzeichnissen der NetzwerkPCs abzuholen.
Würde man da grundsätzlich mit OpenNetworkConnection arbeiten oder liege ich da falsch?
LG
Wolfgang
Re: Netzwerkanwendung
Verfasst: 25.05.2015 22:35
von derschutzhund
Die Datei Nr.txt konnte ich schon lesen mit "ReceiveHTTPFile"
Sieht wirklich recht gut aus!
Alle benutzten IPAdressen konnte ich noch nicht ermitteln.
Re: Netzwerkanwendung
Verfasst: 27.05.2015 17:52
von derschutzhund
Schaut euch mal die Zeilen an. Damit will ich testen welche IPs im LAN belegt sind:
Code: Alles auswählen
Procedure alleipsneu(EventType) ; alle belegten IPs ermitteln
Define ip.i, ergeb.i, ergebnisip.i, sname$, Filename$, hilfzeile$, inhalt$
ergeb =InitNetwork()
If ergeb > 0
For ip = 2 To 55
sname$ = "192.168.178." + Str(ip)
ergebnisip = OpenNetworkConnection(sname$,8000,#PB_Network_TCP,100)
Debug ergebnisip
If ergebnisip > 0
CloseNetworkConnection(ergebnisip)
EndIf
Next
EndIf
EndProcedure
In der Liste bekomme ich im IPBereich von 2 bis 55 nur 0 als Ergebnis obwohl ich sicher bin, dass ein
PC mit der Adresse
http://192.168.178.50:8000 vorhanden ist.
Wenn ich, bevor ich diese Procedure aufrufe, die folgende Procedure starte dann erhalte ich als Rückmeldung "Success", also ist eine Verbindung möglich!
Code: Alles auswählen
Procedure start(EventType)
Define ergebnis.i, Filename$
InitNetwork()
Filename$ = "nr.txt"
If ReceiveHTTPFile("http://192.168.178.50:8000/nr.txt", Filename$)
Debug "Success"
Else
Debug "Failed"
EndIf
EndProcedure
Starte ich aber erst die obere Procedure dann liefert die untere Proc. auch kein Ergebnis mehr.
Bei der oberen muss irgenwo ein Fehler sein!
Wo liegt der Fehler bzw. gibt es eine andere, mögliche Lösung?
LG
Wolfgang
Re: Netzwerkanwendung
Verfasst: 27.05.2015 18:24
von derschutzhund
Eins ist mir aufgefallen: Wenn ich nicht mehr als 10 Adressen, also von 41 bis 50 prüfe dann wird die aktive Adresse mit 192.168.178.50 richtig angezeigt.
Fange ich die Suche bei 40 an dann findet das Programm die Adresse nicht mehr!
Wäre schön wenn mir da jemand helfen könnte die Adressen zu finden!
LG
Wolfgang
Re: Netzwerkanwendung
Verfasst: 27.05.2015 18:27
von NicTheQuick
Ein Timeout von 100 ms ist wahrscheinlich viel zu gering. Mach das lieber 10 mal so hoch oder noch mehr um sicher zu sein. Um die Zeit für den Test zu verkürzen, kannst du ja immer noch mehrere Verbindungen parallel öffnen.
Re: Netzwerkanwendung
Verfasst: 27.05.2015 19:32
von derschutzhund
NicTheQuick hat geschrieben:Ein Timeout von 100 ms ist wahrscheinlich viel zu gering. Mach das lieber 10 mal so hoch oder noch mehr um sicher zu sein. Um die Zeit für den Test zu verkürzen, kannst du ja immer noch mehrere Verbindungen parallel öffnen.
Hallo Nic,
danke für den Tipp!
Wenn ich das Timeout auf 1000ms setze dann wird alles gefunden aber dauert ewig.
Wie kann ich den mehrere Verbindungen gleichzeitig testen?
Re: Netzwerkanwendung
Verfasst: 27.05.2015 20:07
von NicTheQuick
Zum Beispiel mit Threads:
Code: Alles auswählen
Structure Connection
thread.i
host.s
port.i
type.i
timeout.i
successful.i
EndStructure
Procedure checkConnectionThread(*connection.Connection)
Protected conn.i
With *connection
conn = OpenNetworkConnection(\host, \port, \type, \timeout)
If (conn)
CloseNetworkConnection(conn)
\successful = #True
Else
\successful = #False
EndIf
EndWith
EndProcedure
Procedure checkConnections(prefix.s, first.i, last.i, port.i = 8000, type.i = #PB_Network_TCP, timeout.i = 1000)
Protected Dim connections.Connection(last - first)
Protected i.i
For i = first To last
With connections(i - first)
\host = prefix + Str(i)
\port = port
\type = type
\timeout = timeout
\thread = CreateThread(@checkConnectionThread(), @connections(i - first))
EndWith
Next
Delay(100)
For i = first To last
With connections(i - first)
If \thread
WaitThread(\thread)
If \successful
Debug \host + " is up!"
Else
Debug \host + " is down!"
EndIf
Else
Debug "Error for host " + \host
EndIf
EndWith
Next
EndProcedure
CompilerIf Not #PB_Compiler_Thread
CompilerError "Bitte Thread-Unterstützung in den Compiler-Optionen aktivieren!"
CompilerEndIf
InitNetwork()
checkConnections("192.168.178.", 2, 55)
Allerdings scheint hier irgendwas nicht ganz rund zu laufen. Zumindest bei mir stürzt das Programm manchmal an der Stelle 'WaitThread(\thread)' ab und ich weiß noch nicht wieso. Vielleicht ein PB-Bug?
Edit
Backslash bei 'port' hinzugefügt. Danke, edel.
Re: Netzwerkanwendung
Verfasst: 27.05.2015 20:20
von derschutzhund
Von der Geschwindigkeit top aber leider wird 192.168.178.50 als "host is down" angezeigt und das passt ja nicht!
Re: Netzwerkanwendung
Verfasst: 27.05.2015 20:37
von edel
Da fehlt ein Backslash bei Port.
Re: Netzwerkanwendung
Verfasst: 27.05.2015 20:56
von derschutzhund
Code: Alles auswählen
Procedure checkConnectionThread(*connection.Connection)
Protected conn.i
With *connection
conn = OpenNetworkConnection(\host, \port, \type, \timeout)
If (conn)
CloseNetworkConnection(conn)
\successful = #True
Else
\successful = #False
EndIf
EndWith
EndProcedure
Habe es getestet, gleiches Ergebnis!