2011-06-23 20 views
5

estoy haciendo un pequeño cliente FTP para recibir algunos archivos grandes de ftp. He leído en RFC que el comando ABOR es muy problemático para los servidores. Casi todos los servidores que veo continúan enviando datos incluso después de que ABOR haya enviado la conexión de control. El cierre de la transferencia de datos puede resultar (en el 70% de las pruebas) también en la conexión de control de cierre. El servidor simplemente envía el paquete FIN después de mi paquete ABOR presionado. ¿Cuál es el mejor método para detener el acceso en algún byte y no perder la conexión de control? FlashFXP lo hace bien en todos los tipos de retrasos de conexión y servidores. Mientras investigaba el tráfico de tcp, encontré el flujo ftp rfc estándar.programación ftp: cómo cancelar la transferencia de archivos?

Pero en mi caso todavía sin éxito para anular la transferencia de uso de esta técnica:

1) apagado (passive_socket, SD_BOTH)

2) closesocket (passive_socket);

3) enviar (control_socket, "ABORALES \ r \ n")

4) recv (control_socket) - estancado aquí

Gracias

Respuesta

6

El comando "ABOR \ r \ n" debe enviarse como datos fuera de banda. En caso de enviar() -

send(control_socket, "ABOR\r\n", 6, MSG_OOB); 

Algún tiempo después de que recv() código 426 Transferencia cancelada. Conexión de datos cerrada.

El siguiente enlace es más útil si no se puede alcanzar el éxito aborint transferencia: http://www.developer.nokia.com/Community/Discussion/showthread.php?134079-Telnet-quot-Interrupt-Process-quot-(IP)-signal-amp-Telnet-quot-Synch-quot

+1

He estado leyendo acerca de los datos OOB en [otra pregunta en SO] (http://stackoverflow.com/questions/589928/socket-programming-how-do-i-handle-out-of-band-data/591104 # 591104) y también mencionan este caso de uso como un uso típico de datos OOB. Sin embargo, estoy confundido sobre por qué esto es necesario (o incluso recomendado) dado que parece depender de una arquitectura de servidor específica. Si el servidor está escuchando correctamente en la conexión de control y procesa el comando 'ABOR', puede simplemente cerrar la conexión de conexión de datos o detener el envío, ¿no es así? –

+1

@ André, se describen los datos fuera de banda: "Datos urgentes" notifica a la conexión receptora que la transmisión separada es más importante que la transmisión principal. Por lo tanto, primero debe verificar la secuencia separada para procesar la transmisión principal normalmente. Pero en el mundo real significa (como creo) simplemente enviar paquetes TCP de datos con PSH establecidos sin importar el tamaño de la ventana u otras cosas.También me confundí porque esto solo está relacionado con el protocolo FTP que encontré primero. – Sergey

+0

Entiendo cómo funciona. Sin embargo, si respeta el estado de conexión de control del programa cliente, no debe tener * nada * en el búfer de entrada de la conexión de control en el lado del servidor cuando 'ABOR' llega al servidor. Si el uso de OOB tiene un impacto en la velocidad de interpretación de este comando, entonces entendería que la conexión de datos deja de enviar datos más rápido. Sin embargo, el uso de OOB no explica cómo se interpretará el comando 'ABOR' (VS no, en absoluto, como en el caso de OP) en * cualquier * implementación del servidor FTP. –

0

Usted no debe perder su conexión de control cuando se cierra la conexión de transferencia de datos, son dos zócalos separados. Tal vez revise su código para ver por qué se está cerrando la conexión de control.

+0

he comprobado varias veces, en FreeBSD el servidor ftpd independiente simplemente envía un paquete FIN, a continuación, cuando mi cliente envía quiero algo para controlar socket el servidor envía RST. – Sergey

+0

Otra opción es hacer que su código se vuelva a conectar automáticamente en estas desconexiones. Me he dado cuenta de que FileZilla hace esto. –

+0

Eso es lo que estoy haciendo ahora, pero esto realmente lleva mucho tiempo. el código interfiere con los controladores de Windows y no puedo hacer tales retrasos. Estoy usando este código para enviar el comando ABOR sprintf (tb, "% c% c% c% c% cABOR \ r \ n", 0xff, 0xf4, 0xff, 0xfd, 0x06); Como se describe en RFC, el comando ABOR puede requerir un procesamiento especial (los códigos ctrl-c) – Sergey

Cuestiones relacionadas