Witam, zmagam się z problemem klienta FTP, w języku C, na socketach.
Oto co udało mi się do tej pory zrobić :
#include <winsock.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
WSADATA WSAData;
char user[] = "anonymous\n";
char password[] = "test@test.com";
char reply[3];
SOCKET sock; //socket descriptor
SOCKET dataSocket; //data socket descriptor
struct sockaddr_in ftpServAddr; //
struct sockaddr_in dataServAddr;
struct hostent *clientAdress;
unsigned short ServerControlPort = 21;
unsigned short ServerDataPort;
unsigned short ClientControlPort;
unsigned short ClientDataPort;
char *adress ="ftp.tpnet.pl";
char *hostname;
char code[2] ;
int kod_bledu;
char *p;
char buf[1000];
// funkcja sprawdzajaca odpowiedz serwera
int reply_c(bufa)
{
recv(sock, buf, sizeof(buf), 0);
char *code =(char*) malloc(3);
strncpy(code,(char*)bufa,3);
kod_bledu=atoi(code);
printf("SERVER RESPONSE: %d \n", kod_bledu, code);
return(kod_bledu);
}
int komenda(char *command)
{
if (send(sock, command, strlen(command), 0) == -1) printf("blad wysylania");
return (0);
}
int login()
{
do
{
reply_c(buf);
if(kod_bledu == 220) {
printf("Logowanie anonimowe...\n");
komenda("USER anonymous\n");
reply_c(buf);}
if(kod_bledu == 331) {
printf("Password needed\n");
usleep(1000);
komenda("PASS fitas@gmail.com\n");
reply_c(buf);
}
if (kod_bledu == 230)
printf("Zalogowano do ftp!\n");}
while (kod_bledu !=230);
getchar();
system("cls");
return 0;
}
int main(int argc, char ** argv)
{
printf("Tworze socket stream...\n");
if( WSAStartup( MAKEWORD( 2, 0 ), &WSAData ) != NO_ERROR )
{
printf( "Blad inicjalizacji WinSock2\n" );
return( 1 );
}
if ((sock = socket(PF_INET,SOCK_STREAM, IPPROTO_TCP)) == -1)
{
printf ("Nie moge utworzyc socketa !");
}
//data socket
if((dataSocket = socket(PF_INET, SOCK_STREAM,0))== -1 )
{
printf ("Blad tworzenia data socketa!");
}
//konstruowanie struktury server adress
clientAdress = gethostbyname(adress);
memset(&ftpServAddr, 0, sizeof(ftpServAddr));
memcpy(&ftpServAddr.sin_addr, clientAdress->h_addr, clientAdress->h_length);
ftpServAddr.sin_family = AF_INET; /* Internet address family */
// ftpServAddr.sin_addr.s_addr = inet_addr(adress); /* Server IP address */
ftpServAddr.sin_port = htons(ServerControlPort); /* Server port */
//laczenie z socketem
memset(&dataServAddr, 0, sizeof(dataServAddr)); /* Zero out structure */
dataServAddr.sin_family = AF_INET; /* Internet address family */
dataServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Server IP address */
dataServAddr.sin_port = htons(20); /* Server port */
if ( connect(sock, (SOCKADDR*) &ftpServAddr, sizeof(ftpServAddr)) == -1)
{
printf("Blad polaczenia!");
}
else
{
printf("Connect ok!\n");
}
bind(dataSocket,(struct sockaddr *) &dataServAddr, sizeof(dataServAddr));
listen(dataSocket,1);
login();
komenda("LIST");
reply_c(buf);
printf("%s",buf);
getchar();
return (0);
}
Zatrzymałem się na problemie pobierania listy plików z serwera FTP, wiem, że służy do tego funkcja LIST, ale nie bardzo wiem jak się do tego zabrać. Proszę o pomoc, z góry dzięki za wszelkie sugestie ;)