Netzwerkanwendung

Für allgemeine Fragen zur Programmierung mit PureBasic.
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Netzwerkanwendung

Beitrag 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
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Re: Netzwerkanwendung

Beitrag 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.
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Re: Netzwerkanwendung

Beitrag 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
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Re: Netzwerkanwendung

Beitrag 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
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Netzwerkanwendung

Beitrag 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.
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Re: Netzwerkanwendung

Beitrag 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?
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Netzwerkanwendung

Beitrag 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.
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Re: Netzwerkanwendung

Beitrag von derschutzhund »

Von der Geschwindigkeit top aber leider wird 192.168.178.50 als "host is down" angezeigt und das passt ja nicht!
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Netzwerkanwendung

Beitrag von edel »

Code: Alles auswählen

OpenNetworkConnection(\host, port, \type, \timeout)
Da fehlt ein Backslash bei Port.
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Re: Netzwerkanwendung

Beitrag 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!
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
Antworten