[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