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

Code: Alles auswählen

OpenNetworkConnection(\host, port, \type, \timeout)
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!