Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinSock] [FTP] Serwer nie odpowiada na zapytania klienta

Ostatnio zmodyfikowano 2013-06-03 14:54
Autor Wiadomość
kubawal
Temat założony przez niniejszego użytkownika
[WinSock] [FTP] Serwer nie odpowiada na zapytania klienta
» 2013-05-29 17:23:21
Witam!
Ostatnio byłem zmuszony używać FileZillę i postanowiłem napisać coś podobnego :)
Lecz niestety, gdy połączę się z serwerem, na zapytania nie odpowiada :/

Oto kod:
C/C++
u_long ResolveHost( const string & host )
{
    LPHOSTENT hostEntry = gethostbyname( host.c_str() );
   
    if( !hostEntry )
    {
        unsigned int addr = inet_addr( host.c_str() );
        hostEntry = gethostbyaddr(( char * ) & addr, 4, AF_INET );
       
        if( !hostEntry )
        {
            return 0;
        }
    }
   
    return *(( int * ) * hostEntry->h_addr_list );
}

int main()
{
    // inicjuję WSA
    WSADATA wsd;
    if( WSAStartup( MAKEWORD( 2, 2 ), & wsd ) == - 1 )
         exit( 1 );
   
    ENABLE_POLISH_LETTERS;
   
    // inicjuję gniazdo
    int sock = socket( AF_INET, SOCK_STREAM, 0 );
    sockaddr_in host;
    host.sin_family = AF_INET;
    memset( host.sin_zero, NULL, sizeof( host.sin_zero ) );
   
    // inicjowanie połączenia
    string hostname;
    int port;
    cout << "ftp> Podaj nazwę serwera i port> ";
    cin >> hostname >> port;
    host.sin_port = htons( port );
    host.sin_addr.s_addr = htons( ResolveHost( hostname ) );
    if( host.sin_addr.s_addr == NULL )
    {
        cout << "ftp> Nie można pobrać adresu sieciowago dla \"" << hostname << "\": DNS nie odpowiada,\nbądź adres nie istnieje\n";
        system( "pause" );
        exit( 1 );
    }
   
    // łączenie
    cout << "ftp> Łączenie z " << hostname << " (" << inet_ntoa( host.sin_addr ) <<
    ")\nna porcie " << port << " (Network Byte Order: " << host.sin_port << ")...\n";
    if( connect( sock,( sockaddr * ) & host, sizeof( sockaddr_in ) ) == - 1 )
    {
        cout << "ftp> Nie można nawiązać połączenia z " << hostname << " (" << inet_ntoa( host.sin_addr ) <<
        ")\nna porcie " << port << " (Network Byte Order: " << host.sin_port << ")...\n";
        system( "pause" );
        exit( 2 );
    }
   
    cout << "ftp> Połączono.\n";
    char buf[ 100 ] = "";
    while( true )
    {
        cout << "ftp> ";
        cin >> buf;
        if( string( buf ) == "QUIT" )
             return 0;
       
        send( sock, buf, strlen( buf ), 0 );
        strcpy( buf, "" );
        recv( sock, buf, 100, 0 );
        cout << hostname << "> " << buf << endl;
    }
   
    WSACleanup();
    return 0;
}

Oto przykładowy output:
http://www.mediafire.com/view/bam204rrkmxy1y4/log.PNG

Jeśli wiecie, co robię nie tak (a patrzyłem z tego tuta: http://firsthost.nazwa.pl/wordpress/2007/08/01 /winsock-tutorial-2-laczenie-z-hostem/),
to proszę o pomoc.


P-84271
maly
» 2013-05-29 18:10:57
Po wystąpieniu błędów na soketach używaj WSAGetLastError.
P-84274
kubawal
Temat założony przez niniejszego użytkownika
» 2013-05-30 14:32:52
Podejrzewam, że błąd jest w pętli z poleceniami, bo gdy jej nie było, to wszystko ładnie działało.
Może moje ogólne założenia są błędne, i nie tak się używa ftp...
Bardzo możliwe, bo na razie słabo ogarniam ideę tych wszystkich protokołów... :/
P-84337
DejaVu
» 2013-05-30 14:38:30
Idea HTTP sprowadza się do tego:
1) Połącz się z serwerem
2) Wyślij zapytanie do serwera
3) Serwer odpowiada
4) Zakończ połączenie z serwerem
Z serwerem HTTP nie utrzymuje się stałego połączenia. Do serwera HTTP wysyła się tylko prośbę o pobranie konkretnej strony, po czym dostaje się jakąś odpowiedź i na tym się kończy obsługa żądania strony przez serwer.
P-84338
kubawal
Temat założony przez niniejszego użytkownika
» 2013-05-30 15:07:48
Ale mi chodzi o FTP, a nie HTTP
P-84345
kubawal
Temat założony przez niniejszego użytkownika
» 2013-05-31 12:18:40
Ściągnąłem sobie serwer ftp na locala.
Dzieją się dziwne rzeczy, bo "localhost" jest rozszyfrowywane jako zupełnie inny adres IP, niż w rzeczywistości.
P-84446
DejaVu
» 2013-06-03 14:54:41
No bo istnieją adresy IP lokalne jak i globalne. Jeżeli masz na swoim kompie serwer FTP to możesz łączyć się na adres IP 127.0.0.1. Dopóki nie zadziała Ci pełna komunikacja z serwerem FTP używając lokalnego adresu IP, dopóty nie masz co eksperymentować z połączeniami korzystającymi z globalnego adresu IP. Poza tym polecałbym Ci powalczyć z gotowymi bibliotekami do obsługi FTP, a nie wymyślać koło na nowo.
P-84708
« 1 »
  Strona 1 z 1