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: 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() { WSADATA wsd; if( WSAStartup( MAKEWORD( 2, 2 ), & wsd ) == - 1 ) exit( 1 ); ENABLE_POLISH_LETTERS; 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 ) ); 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 ); } 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.PNGJeś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. |
|
maly |
» 2013-05-29 18:10:57 Po wystąpieniu błędów na soketach używaj WSAGetLastError. |
|
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... :/ |
|
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.
|
|
kubawal Temat założony przez niniejszego użytkownika |
» 2013-05-30 15:07:48 Ale mi chodzi o FTP, a nie HTTP |
|
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. |
|
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. |
|
« 1 » |