хочу сделать клиент делающий копию сайта FTP. User-PI - Server A (Dest) User-PI - Server B (Source) ------------------ ------------------ C->A : Connect C->B : Connect C->A : PASV A->C : 227 Entering Passive Mode. A1,A2,A3,A4,a1,a2 C->B : PORT A1,A2,A3,A4,a1,a2 B->C : 200 Okay C->A : STOR C->B : RETR B->A : Connect to HOST-A, PORT-a хочу сделать этот сценарий, но даже конектится не получается....... вот структура Код | typedef struct { char *host; struct sockaddr_in local_address; // our local address ftptran_t tranmode; // current transfer mode int passive; // if 1, try passive mode
// Control Connection int control; // main control socket char control_readbuf[BUFSIZE];
// Data Connection
int data_server; // data server socket int data_transfer; // data transfer connection
} ftpsession_t;
|
вот соединение для команд(это работает) Код | ftpsession_t *ftp_connect(char *host) { struct hostent *hent; struct sockaddr_in in; int len; char *basehost; ftpsession_t *ftp;
// ftp_errorfile = stderr;
// allocate ftpsession_t ftp = malloc(sizeof(*ftp));
// resolve address
basehost = getbasehost(host); if(!(hent = gethostbyname(basehost))) return NULL; ftp->control = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); ftp->passive = 1;
in.sin_family = AF_INET; in.sin_addr.s_addr = ((struct in_addr *) hent->h_addr)->s_addr; in.sin_port = getbaseport(host);
// connect to server
if(connect(ftp->control, (struct sockaddr *) &in, sizeof(in)) < 0) { ftp_perror("ftp_connect->connect"); return NULL; }
// clear command read buffer
ftp->control_readbuf[0] = '\0';
// wait for hello message
if(ftp_getcmdresponse(ftp) != FTP_HELLO) { // didnt get hello response // disconnect and return -1
ftp_puts("ftp_connect: incorrect response from server");
close(ftp->control);
return NULL; }
// get local address
len = sizeof(ftp->local_address);
if(getsockname(ftp->control, (struct sockaddr *)&ftp->local_address, &len) < 0) { ftp_perror("ftp_connect->getsockname");
close(ftp->control); return NULL; }
ftp->tranmode = TRAN_UNKNOWN; // dont know yet
return ftp; }
|
и вот я пытаюсь сделать еще одно соединение для данных(вот это не работает, пишет Network is unreachable Код | int ftp2ftp_copy(ftpsession_t *src, ftpsession_t *dest) { char tempstr[BUFSIZE]; struct sockaddr_in in; int s_in = sizeof(in); long servaddr, servport; char *addr; int h1, h2, h3, h4, p1, p2;
in.sin_family = AF_INET; in.sin_addr.s_addr = inet_addr("ftp.inoveb.ro"); in.sin_port = htons(20);
// create socket for transfer
src->data_transfer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(src->data_transfer < 0) { perror("ftp_accept->socket"); return -1; } // try to connect if(connect(src->data_transfer, (struct sockaddr *) &in, sizeof(in)) < 0)////////////вот тут ошибка { perror("ftp_accept->connect"); return -1; } ftp_sendcmd(src, "PASV", "");
// make sure we get the correct response
if(ftp_getcmdresponse(src) == FTP_PASSIVEOK) { // find address
addr = strchr(cmd_response, '(');
// if ( not found, return error
if(!addr) { printf("ftp_listen: invalid response from server\n"); return -1; }
// skip past the (
addr++; // read address out if(sscanf(addr, "%d,%d,%d,%d,%d,%d", &h1, &h2, &h3, &h4, &p1, &p2) < 6) { printf("ftp_listen: invalid response from server\n"); return -1; } } return 0; }
|
Заранее спасибо. Это сообщение отредактировал(а) sas8899 - 27.12.2008, 22:38
|