2011-06-23 22 views
5

Robię mały klient ftp do otrzymywania dużych plików z ftp. W RFC czytałem, że polecenie ABOR jest bardzo problematyczne dla serwerów. Prawie wszystkie serwery, które widzę, nadal wysyłają dane nawet po wysłaniu przez ABOR połączenia sterującego. Zamknięcie transferu danych może również spowodować (w 70% przypadków) zamknięcie połączenia sterującego. Serwer po prostu wysyła pakiet FIN po moim pchniętym pakiecie ABOR. Jaka jest najlepsza dobra metoda, aby przestać odbierać w jakimś bajcie i nie stracić połączenia kontrolnego? FlashFXP robi to dobrze na wszystkich typach opóźnień i serwerów. Podczas badania ruchu TCP znalazłem standardowy przepływ rfc ftp.programowanie ftp: jak przerwać transfer plików?

Ale w moim przypadku jeszcze nie sukces, aby przerwać przesyłanie przy użyciu tej techniki:

1) zamknięcie (passive_socket, SD_BOTH)

2) closesocket (passive_socket);

3) send (control_socket "ABOR \ r \ n")

4) recv (control_socket) - utknęły tu

Dziękuję

Odpowiedz

6

Komenda "ABOR \ r \ n" powinna zostać wysłana jako dane pozapasmowe. W przypadku send() -

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

Jakiś czas po recv() kod 426 Przeniesienie przerwane. Połączenie danych zamknięte.

Poniższy link jest bardziej pomocne, jeśli nie można osiągnąć sukces aborint transferu: http://www.developer.nokia.com/Community/Discussion/showthread.php?134079-Telnet-quot-Interrupt-Process-quot-(IP)-signal-amp-Telnet-quot-Synch-quot

+1

Czytałem o danych OOB w [innym pytaniu na SO] (http://stackoverflow.com/questions/589928/socket-programming-how-do-i-handle-out-of-band-data/591104 # 591104) i wspominają także o tym przypadku użycia jako typowego wykorzystania danych OOB. Jestem jednak zdezorientowany, dlaczego jest to konieczne (lub nawet zalecane), biorąc pod uwagę, że zdaje się opierać na specyficznej architekturze serwera. Jeśli serwer prawidłowo nasłuchuje na połączeniu sterującym i przetwarza polecenie "ABOR", może po prostu zamknąć gniazdo do przesyłania danych lub przestać wysyłać, prawda? –

+1

@ André, dane poza pasmem są usuwane: "Pilne dane" powiadamia połączenie odbierające, że oddzielny strumień jest ważniejszy niż główny strumień. Dlatego najpierw należy sprawdzić osobny strumień, aby normalnie przetworzyć główny strumień. Ale w prawdziwym świecie oznacza to (jak sądzę) właśnie wysłanie pakietu danych TCP z zestawem PSH bez względu na rozmiar okna czy inne rzeczy.Ja też się pomyliłem, ponieważ jest to związane tylko z protokołem FTP, który znalazłem jako pierwszy. – Sergey

+0

Rozumiem, jak to działa. Jeśli jednak szanujesz stan połączenia sterującego z programu klienta, nie powinieneś mieć * niczego * w buforze wejściowym sterowania po stronie serwera, gdy 'ABOR' dotrze do serwera. Jeśli użycie OOB ma wpływ na szybkość interpretacji tego polecenia, to zrozumiałbym, że połączenie danych przestaje szybciej wysyłać dane. Jednak użycie OOB nie wyjaśnia, w jaki sposób spowoduje to interpretację polecenia 'ABOR' (w ogóle nie VS, tak jak w przypadku OP) na * dowolnej * danej implementacji serwera FTP. –

0

Nie należy tracić połączenia sterującego podczas zamykania połączenie przesyłania danych, są to dwa oddzielne gniazda. Może sprawdź swój kod, aby zobaczyć, dlaczego połączenie sterujące jest zamknięte.

+0

Sprawdziłem kilka razy pod FreeBSD samodzielny serwer ftpd prostu wysyła pakiet FIN, a następnie, gdy mój klient chce wysyła coś do kontrolowania gniazdo serwer wysyła RST. – Sergey

+0

Inną opcją jest automatyczne ponowne połączenie twojego kodu na tych rozłączeniach. Zauważyłem, że FileZilla to robi. –

+0

To teraz robię, ale to naprawdę zajmuje dużo czasu. kod ingeruje w sterowniki Windowsa i nie mogę robić takich opóźnień. Używam tego kodu do wysyłania polecenia ABOR-sprintf (tb, "% c% c% c% c% cABOR \ r \ n", 0xff, 0xf4, 0xff, 0xfd, 0x06); Jak zostało to opisane w RFC, polecenie ABOR może wymagać specjalnego przetwarzania (kody ctrl-c). – Sergey