[Python-de] socket.recv() und tcp shutdown
Ulli Horlacher
framstag at rus.uni-stuttgart.de
Sa Sep 19 13:28:53 CEST 2015
Ich habs selber gefunden, die Loesung ist trivial :-)
Ulli Horlacher <framstag at rus.uni-stuttgart.de> wrote:
> Ich moechte Daten (Text Zeilen) via tcp von einem Server lesen.
> Leider erkennt socket.recv() nicht, dass der Server die Verbindung beendet
> hat und wartet so ewig.
>
> Mein Code:
>
> try:
> sock = socket.create_connection((server,port))
> except socket.error as e:
> die("cannot connect to %s:%d - %s" % (server,port,e.strerror))
>
> while True:
> line = ''
> while True:
> try:
> c = sock.recv(1)
> except socket.error as e:
> die("cannot read from %s:%d - %s" % (server,port,e.strerror))
> if c == None: break
> if c == "\n": break
> line += c
> print(line)
>
>
> Ich haette erwartet, dass es am Ende zu der Fehlermeldung "cannot read"
> kommt oder dass c==None eintritt, aber sock.recv() blockiert und erkennt
> den tcp shutdown nicht.
Knapp daneben :-)
sock.recv(1) liefert bei tcp shutdown kein None zurueck, sondern ''!
Es blockiert also gar nicht, wie ich faelschlicherweise angenommen hatte.
Ich hatte also eine Endlosschleife produziert :-}
(Ich haette auf den load achten sollen, dann waers mir aufgefallen)
Leider steht das nicht in https://docs.python.org/2/library/socket.html
So funktionierts nun:
while True:
line = ''
while True:
try:
c = sock.recv(1)
except socket.error as e:
die("cannot read from %s:%d - %s" % (server,port,e.strerror))
if c == '' or c == "\n": break
line += c
print(line)
if c == '':
die("%s:%d has closed the connection" % (server,port))
--
Ullrich Horlacher Server und Virtualisierung
Rechenzentrum IZUS/TIK E-Mail: horlacher at tik.uni-stuttgart.de
Universitaet Stuttgart Tel: ++49-711-68565868
Allmandring 30a Fax: ++49-711-682357
70550 Stuttgart (Germany) WWW: http://www.tik.uni-stuttgart.de/
Mehr Informationen über die Mailingliste python-de