Хочу написать 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 ; }
send(main_ftp_socket,buff,sizeof(buff),0); нужно было вместо sizeof strlen,обьясните почему ? первую команду сервер принимал...
после авторизации нужно открыть еще одни сокет для передачи данных, насколько я понимаю это должен быть сервер, т.к. серверу(FTP) нужно передать IP адресс и порт,или все таки не сервер ?.. В общем я все это передаю , от сервера приходит ответ мол с POST-ом все ок,что дальше ?сервер весит в ожидании подключения... Попутно задам еще вопрос, как узнать ВНЕШНИЙ ip адрес? gethostname() gethostbyname () т.к. у меня роутер раздает инет эти функции определяют внутренний ипак = \
А зачем ты юзаешь активный режим? Юзай пассивный режим. Тогда не ты должен будешь открывать порт, а сервак откроет порт и передаст тебе куда коннектится. Причем передаст в длинном формате. типа 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 так как половина людей прикрыта роутерами и натом
Сделал так , как вы посоветовали, теперь другая проблема.. посылаю команду LIST ,сервер ее принимает и бесконечно шлет на "вспомогательный" сокет сообщения,проблема как не странно решается getch(); Наверно нужно ответить серверу что данные приняты или что то в этом роде ?
отснифал(вродеб) ,нечего нового для себя не увидел , наверно код неправильный,хотя в чем он может быть не правильный.. сокеты блокируемые,значит если отрабатывает recv то сервер на сокет что то отправил, или не так ? проблему можно решить проверкой recv на ноль,так делать правильно ? функция приема сообщений
Если компилировать в C++ Builder все нормально, бесконечный LIST только в VS , в чем может быть дело ?