Python socket enviar EOF

Tengo un progtwig simple de transferencia de archivos donde un socket envía datos de archivos y otro socket recibe los datos y los escribe en un archivo.

Necesito enviar un acuse de recibo una vez que la transferencia haya finalizado desde el destino al origen

Código de destino

s.accept() f = s.makefile() f.read(1024) 

Código para la fuente

 s.connect(('localhost',6090)) f = s.makefile() f.write('abcd') f.flush() 

Aquí viene el problema, ya que “abcd” no es 1024 bytes, el destino se bloqueará hasta que se reciban 1024 bytes
La solución sería cerrar () el socket, pero como necesito una confirmación del destino, no puedo cerrar el socket.
¿Cómo le digo al destino que deje de bloquear? Estaba pensando en escribir un carácter EOF que leí en línea que “\ x04” es EOF, pero no funciona.
Además, como los datos pueden ser binarios, no quiero usar el método readline ().

Diseñe un protocolo (un acuerdo entre cliente y servidor) sobre cómo enviar mensajes. Una forma simple es “el primer byte es la longitud del mensaje, seguido del mensaje”. Ejemplo en bruto:

Cliente

 Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from socket import * >>> s=socket() >>> s.connect(('localhost',5000)) >>> f=s.makefile() >>> f.write('\x04abcd') >>> f.flush() 

Servidor

 Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> from socket import * >>> s=socket() >>> s.bind(('localhost',5000)) >>> s.listen(1) >>> c,a=s.accept() >>> f=c.makefile() >>> length=ord(f.read(1)) >>> f.read(length) 'abcd' 

Escribir y leer desde un socket son separados. Puedes intentar cerrar un socket para escribir y dejarlo abierto para leer.

Consulte http://docs.python.org/library/socket.html#socket.socket.shutdown

Además, lo que FTP hace es usar dos sockets: uno para datos y otro para esta “confirmación”.

Estarías más contento usando un segundo socket para estos metadatos adicionales.

En realidad, no desea utilizar un marcador ‘EOF’ si tiene la intención de enviar datos binarios a través de la tubería. ¿Qué sucede si sus datos binarios incluyen esa secuencia de bytes? Podría ‘escapar’ para evitar que eso suceda, pero eso requiere que revise ambos extremos y luego asegúrese de escapar también de la secuencia de escape.

Si está haciendo esto para algún tipo de sistema de producción, mire a su alrededor para ver si hay una API de red que pueda usar (algo como FTP, HTTP, SFTP, etc.).

Si esto es una escuela o un proyecto a pequeña escala, lo que debe hacer es escribir un protocolo de comunicaciones. El más simple podría ser que el remitente transmita un único entero binario X (seleccione un tamaño de datos y se quede con él), y luego envíe X bytes de datos binarios. El receptor primero engancha el tamaño, luego solo espera recibir esa cantidad de datos. Recuerde que si necesita enviar más bytes de los que puede enviar el tamaño de datos de X, deberá ‘fragmentar’ sus datos.

También considere lo que sucede cuando las comunicaciones se pierden durante la transferencia. Puede establecer tiempos de espera en read (), pero luego debe recuperarse correctamente si las comunicaciones se reanudan inmediatamente después de su tiempo de espera (aunque la eliminación de todos los datos puede considerarse correcta, dependiendo del sistema).