Cuando cierro la toma situada en un extremo de una conexión, el otro extremo se pone un error la segunda vez que envía los datos, pero no la primera vez:Python no detecta una toma cerrada hasta la segunda enviar
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("localhost", 12345))
server.listen(1)
client = socket.create_connection(("localhost",12345))
sock, addr = server.accept()
sock.close()
client.sendall("Hello World!") # no error
client.sendall("Goodbye World!") # error happens here
He intentado configurar TCP_NODELAY, usando send
en lugar de sendall
, comprobando el fileno()
, no encuentro ninguna forma de obtener el primer envío para arrojar un error o incluso detectar que falló. EDITAR: llamando al sock.shutdown
antes de sock.close
no ayuda. EDIT # 2: incluso agregando un time.sleep
después del cierre y antes de escribir no importa. EDIT # 3: comprobar el conteo de bytes devuelto por send
no ayuda, ya que siempre devuelve el número de bytes en el mensaje.
De modo que la única solución que puedo encontrar si quiero detectar errores es seguir cada sendall
con un que generará un error. Pero esto parece hackish. Estoy en un Linux 2.6.x así que incluso si una solución solo funciona para ese sistema operativo, estaría feliz.
estoy teniendo el mismo problema. ¿Cómo terminaste resolviendo el problema en tu código? – HighCommander4
@HighCommander: Terminé agregando un 'cliente.sendall ("") 'después de cada' enviar', que técnicamente no está garantizado para el error, pero funciona para mi programa dando los tiempos y detalles de lo que estoy haciendo. Esto es poco elegante y realmente desearía que hubiera una forma de acceder al estado del socket TCP subyacente, pero desafortunadamente parece que no lo está, ya sea en Python o C. –
¿funciona para usted cuando el cliente y el servidor están en máquinas diferentes? No es para mí, el sendall() tiene éxito en ese caso. – HighCommander4