Konfigurierbarer TCP-Client - Ausnahmebehandlung

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Pythonis
User
Beiträge: 6
Registriert: Montag 28. Dezember 2015, 19:47

Hallo zusammen,

Ich entwickele gerade einen TCP-Client in Python, welcher konfigurierbar sein soll.
Dafür gibt der Anwender den Ziel-Host und den Port über eine Konsole ein.
Zuerst möchte ich nur den Ziel-Host behandeln [Der Prozess mit dem Ziel-Port ist mit bereits klar]
Der Ziel-Host soll in Form einer IP angegeben werden, z.B. 0.0.0.0

Da ich robuste Anwendungsprogrammierung bevorzuge, soll es eine Ausnahmebehandlung geben.
Wenn man also statt 0.0.0.0 einfach einen String abc eintippt, soll eine Fehlermeldung erscheinen
und dem Anwender dementsprechend mitteilen, dass er eine ungültige Eingabe gemacht hat.
Teilweise wird die Fehlermeldung ausgegeben, aber die richtige IP kann nicht eingegeben werden
bzw. es können andere Zeichenfolgen getippt werden, welche dann als die IP angesehen werden.

(Die weiteren Fehlermeldungen bekomme ich den Griff.)

Ich habe bereits daran gedacht, die eingegebene IP mit einem Muster zu vergleichen, möglicherweise
mit einer Prüfung der eingegebenen IP-Addresse eben mit einem Muster. :?:
Ich habe keine Ahnung, wie man sowas sonst machen soll :(

Hat jemand eine Idee? :D
(Jeder Tipp könnte mir ja schließlich helfen)

Hier der Source-Code:

Code: Alles auswählen

import socket

while True:
	try:
		x = raw_input("Type target IP >")
		x = float(x) 			# Float??? Welcher Datentyp entspricht z.B. 0.0.0.0 ? 
		break
	except ValueError:
		print("Please select a target like 0.0.0.0")
	except SyntaxError:
		print("Please select a target like 0.0.0.0")
		
print ("Target IP: " ,x)

# Targets werden festgelegt, erstmal soll nur der Host einstellbar sein, deswegen der Host als Variable
target_host = x
target_port = 9999

# Socket-Objekt erzeugen
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Client-Verbindung herstellen
client.connect((target_host,target_port))

# Einige Daten senden
client.send("Hi")

# Einige Daten empfangen
response = client.recv(4096)

print response
Hier noch ein Bild der Konsolenanwendung
Bild


System: (Linux)Xubuntu IDE: Geany
Zuletzt geändert von Anonymous am Montag 28. Dezember 2015, 22:21, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Pythonis
User
Beiträge: 6
Registriert: Montag 28. Dezember 2015, 19:47

Tut mir leid, das Bild wird nicht richtig dargestellt.
Hier der Link: https://www.dropbox.com/s/4p1wf278qksw3 ... t.png?dl=0
BlackJack

@Pythonis: Der Datentyp einer IP entspricht einer Zeichenkette. Ob die das richtige enthält kannst Du prüfen, dabei darfst Du das Ergebnis aber nicht in irgendetwas anderes umwandeln.

Allerdings ist die Frage ob Du das überhaupt prüfen solltest, weil das dem Nutzer die Möglichkeit nimmt etwas anderes zu übergeben, zum Beispiel den Hostnamen oder einen kompletten Host/Domain-Namen. Man kann `socket()` ja schliesslich nicht nur Zeichenketten mit IPs übergeben. Wenn Du da generischer prüfen willst ohne tatsächlich das Socket zu verbinden, verwende `socket.gethostbyname()` und behandle eventuelle Ausnahmen.

Anstelle von `send()` solltest Du `sendall()` verwenden. Oder `send()` in eine Schleife stecken die sicherstellt, dass auch tatsächlich alles gesendet wird.

Hör mal auf ``print`` mit Klammern zu schreiben. Insbesondere Zeile 13 verhält sich sicher nicht so wie das gedacht war. Oder mach einen ``from __future__ import print_function`` am Anfang um aus ``print`` tatsächlich eine Funktion zu machen.

Statt das Bild einer schlecht lesbaren, halb transparenten Konsole bei einem extenen Anbieter zu hosten, hättest Du auch einfach den Text in den Beitrag kopieren können.
Pythonis
User
Beiträge: 6
Registriert: Montag 28. Dezember 2015, 19:47

Erstmal vielen Dank BlackJack.
Gibt es eine spezielle Funktion, um wie etwa hier das Format einer Zeichenkette zu überprüfen.
Man überprüft also eine Zeichenkette nach einem bestimmten Muster wie z.B. in meinem Fall x.x.x.x.

Die Informationen bringen mich aber trotzdem auf jeden Fall weiter!
Danke auch für die nun geänderte Codebox!
BlackJack

@Pythonis: Schau Dir halt mal an wie so eine IP aufgebaut ist, was die einzelnen Zeichen/Teile bedeuten, und dann schreib eine Funktion welche die Zeichenkette zerlegt und die Einzelteile prüft. Wobei Du damit wie gesagt dem Benutzer verweigerst das er wahrscheinlich wesentlich leichter zu merkende Hostnamen verwendet.
Antworten