FTP авторизация

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by winsock, 19 Aug 2010.

  1. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    Хочу написать FTP клиент ,застрял на авторизации...
    При попытке отправить пароль сервер говорит что неверная команда,что не так делаю ?

    готовый для компиляции код
    Code:
    #include <iostream> 
     #include <WinSock2.h>  
    #include <Windows.h>  
    #include <conio.h>   
     using namespace std;   
     int main ()  {  
      	
    WSADATA ws;  	
    WSAStartup(MAKEWORD(2,2),&ws);    	
    SOCKET main_ftp_socket;  	
    main_ftp_socket=socket(AF_INET,SOCK_STREAM,0);    	sockaddr_in ftp_addr;  	
    ftp_addr.sin_family=AF_INET;  
    	ftp_addr.sin_port=htons(21);  	
    hostent * ht;  	
    ht = gethostbyname("nisedeath.hdd1.ru");  
    memcpy(&ftp_addr.sin_addr,ht->h_addr_list[0],ht->h_length);    	
    connect(main_ftp_socket,(sockaddr*)&ftp_addr,sizeof(ftp_addr));    	
    char buff[255];  	  	
    recv(main_ftp_socket,buff,sizeof(buff),0);  	cout<<buff<<endl;    	
    strcpy(buff,"USER u26483s1\r\n");  	
    send(main_ftp_socket,buff,sizeof(buff),0);  	
    cout<<"send user name"<<endl;  	  	
    recv(main_ftp_socket,buff,sizeof(buff),0);  	cout<<buff<<endl;  	  	
    strcpy(buff,"PASS 72G4agp2Z\r\n");  	
    send(main_ftp_socket,buff,sizeof(buff),0);  
    	cout<<"send user password"<<endl;    	
    recv(main_ftp_socket,buff,sizeof(buff),0);  	cout<<buff<<endl;      	
    getch();  	
    return 0 ;  }  
     
    #1 winsock, 19 Aug 2010
    Last edited: 19 Aug 2010
  2. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    send(main_ftp_socket,buff,sizeof(buff),0);

    нужно было вместо sizeof strlen,обьясните почему ?
    первую команду сервер принимал...
     
  3. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    после авторизации нужно открыть еще одни сокет для передачи данных, насколько я понимаю это должен быть сервер, т.к. серверу(FTP) нужно передать IP адресс и порт,или все таки не сервер ?..
    В общем я все это передаю , от сервера приходит ответ мол с POST-ом все ок,что дальше ?сервер весит в ожидании подключения...

    Попутно задам еще вопрос, как узнать ВНЕШНИЙ ip адрес?
    gethostname()
    gethostbyname ()

    т.к. у меня роутер раздает инет эти функции определяют внутренний ипак = \
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А зачем ты юзаешь активный режим? Юзай пассивный режим. Тогда не ты должен будешь открывать порт, а сервак откроет порт и передаст тебе куда коннектится. Причем передаст в длинном формате. типа
    PASV
    227 Entering Passive Mode (95,31,8,195,195,143)
    т.е. ты послал PASV, а сервак ответил 227 Entering Passive Mode (95,31,8,195,195,143)
    и тут 95,31,8,195,195,143 это значит IP = 95.31.8.195 PORT = 50063
    PORT вычисляется как 195 * 256 + 143

    В принципе так чаще всего юзается, потому что не у всех есть внешний IP так как половина людей прикрыта роутерами и натом
     
  5. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    Сделал так , как вы посоветовали, теперь другая проблема..

    посылаю команду LIST ,сервер ее принимает и бесконечно шлет на "вспомогательный" сокет сообщения,проблема как не странно решается getch();

    Наверно нужно ответить серверу что данные приняты или что то в этом роде ?
     
    #5 winsock, 20 Aug 2010
    Last edited: 20 Aug 2010
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    блин, отснифай как тотал или какой-нить браузер общается с серваком и всё увидишь как и что
     
  7. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    отснифал(вродеб) ,нечего нового для себя не увидел , наверно код неправильный,хотя в чем он может быть не правильный.. сокеты блокируемые,значит если отрабатывает recv то сервер на сокет что то отправил, или не так ?

    проблему можно решить проверкой recv на ноль,так делать правильно ?

    функция приема сообщений
     
  8. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    Если компилировать в C++ Builder все нормально, бесконечный LIST только в VS , в чем может быть дело ?
     
  9. winsock

    winsock New Member

    Joined:
    15 Aug 2010
    Messages:
    57
    Likes Received:
    2
    Reputations:
    0
    проблема была в сout,заменил на printf и все норм стало, почему ?