En supposant que vous êtes à l'aide de la douille standard module, vous devriez être en rattrapage de l' socket.error: (32, 'Broken pipe')
d'exception (pas IOError comme d'autres l'ont suggéré). Ce sera soulevée dans le cas que vous avez décrit, c'est à dire l'envoi/l'écriture d'un socket pour lesquels la distance est déconnecté.
import socket, errno, time
# setup socket to listen for incoming connections
s = socket.socket()
s.bind(('localhost', 1234))
s.listen(1)
remote, address = s.accept()
print "Got connection from: ", address
while 1:
try:
remote.send("message to peer\n")
time.sleep(1)
except socket.error, e:
if isinstance(e.args, tuple):
print "errno is %d" % e[0]
if e[0] == errno.EPIPE:
# remote peer disconnected
print "Detected remote disconnect"
else:
# determine and handle different error
pass
else:
print "socket error ", e
remote.close()
break
except IOError, e:
# Hmmm, Can IOError actually be raised by the socket module?
print "Got IOError: ", e
break
Notez que cette exception ne sera pas toujours être soulevées lors de la première écriture pour une socket fermée - plus généralement la deuxième écrire (à moins que le nombre d'octets écrits dans la première écriture est plus grande que la prise de la taille de la mémoire tampon). Vous devez garder cela à l'esprit dans le cas où votre application pense que l'extrémité distante reçu les données de la première écrire quand on peut déjà avoir déconnecté.
Vous pouvez réduire le taux d'incidence (mais ne pas éliminer entièrement) en utilisant select.select()
(ou poll
). Vérifier les données prêt à lire de par les pairs avant de tenter une écriture. Si select
des rapports qu'il y a à disposition des données à lire à partir de la prise par les pairs, le lire en utilisant socket.recv()
. Si cela renvoie une chaîne vide, l'homologue distant a fermé la connexion. Car il y a encore une condition de concurrence ici, vous aurez toujours besoin de l'attraper et de gérer l'exception.
Twisted est idéal pour ce genre de chose, cependant, il semble que vous avez déjà écrit un peu juste de code.