telnet ueber loopback
Verfasst: Donnerstag 6. Januar 2022, 17:48
Ich hatte ein kleines Problem mit einer telnet socket Verbindung ueber Loopback.
Die Suche hier hat nichts ergeben; aber vielleicht hatte ich nur falsche Suchbegriffe ...
Ich habe das Problem dann auch etwas umstaendlicher geloest, aber mich interessiert, warum das einfache Programm nicht geht.
Das Problem in Kurzform:
Die Verbindung Client -> Server geht.
Die Verbindung Server -> Client macht viele retransmisions; bzw timeout. Oder haengt ohne timeout, auch wenn der Server Daten liefert.
Mehr Details:
Ein (python) Protokollkonververter (https://www.dk1ri.de/dhw/IC705_interface_python.zip, noch mit kleinen Fehlern;
der server Teil steht in io_handling) steuert ein Geraet ueber USB.
Der Konverter hat einen terminal und einen telnet Server Zugang mit Threading (nicht blockierend)
Das zu steuernde Gerät hat ca 500 Parameter, die ein (Python) Clientprogramm lesen soll, damit ein Apache Server mit PHP die Daten
sofort verwenden kann. Das Abrufen aller Daten vom Geraet dauert.
Der client ist sehr einfach. Das wesentliche ist in einer Schleife, die mit i die Steurbefehle fuer das Geraet liefert:
while...:
...
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
try:
s.settimeout(2)
s.connect((HOST, PORT))
s.sendall(bytes(send_string, 'utf-8'))
data = s.recv(1024)
s.close()
print("da",str(data))
trx_value_f.write(str(data))
trx_value_f.write(chr(10))
i += 1
repetitions = 0
except socket.timeout:
s.close()
data = ""
print("timeout", send_string, repetitions)
repetitions += 1
if repetitions == 5:
time.sleep(1)
# 5 repetions -> ingnore , step to next
i += 1
repetitions = 0
trx_value_f.write("x "+ send_string)
trx_value_f.write(chr(10))
Der Win10 Laptop hat eine Last von 25%, Speicher 40%; aendert sich kaum, waehrend die beiden Programme laufen.
Die timeouts haeufen sich, je laenger das Clientprogramm laeuft, ist auch bei jedem Lauf unterschiedlich.
Ich muss noch erwaehnen, dass "keine Antwort" des Servers eigentlich erlaubt sein soll.
Ich habe es dann mir threading auf der Clientseite, etwas handshake und timeout Ueberwachung hinbekommen.
Das ganze laeuft so auch wesentlich schneller.
Aber warum hat die obige einfache Loesung so viele Verbindungsfehler?
Guenter
Die Suche hier hat nichts ergeben; aber vielleicht hatte ich nur falsche Suchbegriffe ...
Ich habe das Problem dann auch etwas umstaendlicher geloest, aber mich interessiert, warum das einfache Programm nicht geht.
Das Problem in Kurzform:
Die Verbindung Client -> Server geht.
Die Verbindung Server -> Client macht viele retransmisions; bzw timeout. Oder haengt ohne timeout, auch wenn der Server Daten liefert.
Mehr Details:
Ein (python) Protokollkonververter (https://www.dk1ri.de/dhw/IC705_interface_python.zip, noch mit kleinen Fehlern;
der server Teil steht in io_handling) steuert ein Geraet ueber USB.
Der Konverter hat einen terminal und einen telnet Server Zugang mit Threading (nicht blockierend)
Das zu steuernde Gerät hat ca 500 Parameter, die ein (Python) Clientprogramm lesen soll, damit ein Apache Server mit PHP die Daten
sofort verwenden kann. Das Abrufen aller Daten vom Geraet dauert.
Der client ist sehr einfach. Das wesentliche ist in einer Schleife, die mit i die Steurbefehle fuer das Geraet liefert:
while...:
...
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
try:
s.settimeout(2)
s.connect((HOST, PORT))
s.sendall(bytes(send_string, 'utf-8'))
data = s.recv(1024)
s.close()
print("da",str(data))
trx_value_f.write(str(data))
trx_value_f.write(chr(10))
i += 1
repetitions = 0
except socket.timeout:
s.close()
data = ""
print("timeout", send_string, repetitions)
repetitions += 1
if repetitions == 5:
time.sleep(1)
# 5 repetions -> ingnore , step to next
i += 1
repetitions = 0
trx_value_f.write("x "+ send_string)
trx_value_f.write(chr(10))
Der Win10 Laptop hat eine Last von 25%, Speicher 40%; aendert sich kaum, waehrend die beiden Programme laufen.
Die timeouts haeufen sich, je laenger das Clientprogramm laeuft, ist auch bei jedem Lauf unterschiedlich.
Ich muss noch erwaehnen, dass "keine Antwort" des Servers eigentlich erlaubt sein soll.
Ich habe es dann mir threading auf der Clientseite, etwas handshake und timeout Ueberwachung hinbekommen.
Das ganze laeuft so auch wesentlich schneller.
Aber warum hat die obige einfache Loesung so viele Verbindungsfehler?
Guenter