#include <sys/socket.h> #include <errno.h> #include <sys/types.h> #include <netinet/in.h> #include <netdb.h> #include <stdio.h> #include <string.h> #define PORTS 21 int indice_port(char tab[100],int nbre) { int nbre_virgule=0; int i=0; while(1) { if(i>99){/*printf("\non sort 99\n");*/break;} else { if(tab[i]==',')nbre_virgule++; if(nbre_virgule==nbre)break; /*on sort si on est a la fin de la reponse*/ if(tab[i]=='.'){/*printf("\non sort a cause de .\n");*/break;} i++; } } return i+1; } int Quelport(char tab[100]) { int nbre_virgule=0; int taille_port=0; char tmp[8]; char tmp2[8]; int i=0; int indice; indice=indice_port(tab,4);//pour arriver à la partie port de la reponse while(1) { if(i>8)break; if(tab[indice]==')')break; tmp[i]=tab[indice]; i++; indice++; } tmp[i]='\0'; //ainsi on ne recupere pas la derniere parenthese /*il faut supprimer la virgule*/ indice=0; i=0; while(1) { if(i>6)break; if(tmp[indice]==')')break; if(tmp[indice]!=',') { tmp2[i]=tmp[indice]; i++; } indice++; } //printf("\nle port dans la fonction vaut %s\n",tmp2); return atoi(tmp2); } int main(void) { /*les variables*/ int sock,sock_data;//sock pour le flux commande et sock_data pour le flux data int i; int taille;//taille des reponses récuperer char resp[100];//tableau pour les réponses aux commandes char buf[1000]; int port; //pour le mode passif struct hostent *h; struct sockaddr_in dest,dest_data;//dest pour les commande dest_data pour la data /*Creation d'un socket pour la communication via un flux réseau*/ if((sock=socket(AF_INET,SOCK_STREAM,0))<0) { perror("sock");//renvoi du code d'erreur return 1; } dest.sin_family = AF_INET;//Pour préciser que c'est une communication réseau dest.sin_port = htons(PORTS); //Préciser le numéro de port soit le 21 pour les commandes h=gethostbyname("ServFTP");//Recuperer l'adresse IP du serveur FTP dans le fichier /etc/hosts bcopy(h->h_addr,(struct sockaddr *)&dest.sin_addr,h->h_length);//mettre l'adresse de destination dans la struct sockaddr_in /*test de connection au serveur*/ if(connect(sock,(struct sockaddr *)&dest, sizeof(struct sockaddr))<0) { printf("\nerreur flux commande"); perror("connect");//renvoi du code d'erreur return 2; } /*transmission du login*/ write(sock,"USER body\r\n",11); taille=read(sock,resp,sizeof(resp)); for(i=0;i<taille;i++) printf("%c",resp[i]); /*transmission du mot de passe*/ write(sock,"PASS passwd\r\n",13); taille=read(sock,resp,sizeof(resp)); for(i=0;i<taille;i++) printf("%c",resp[i]); /*transmettre le type de systeme du client*/ write(sock,"SYST\r\n",6); taille=read(sock,resp,sizeof(resp)); for(i=0;i<taille;i++) printf("%c",resp[i]); /*Passage en mode passif*/ write(sock,"PASV\r\n",6); taille=read(sock,resp,sizeof(resp)); for(i=0;i<taille;i++) printf("%c",resp[i]); taille=read(sock,resp,sizeof(resp)); for(i=0;i<taille;i++) printf("%c",resp[i]); /*fonction simple qui permet de recuperer dans la reponse à PASV le numero de port*/ port=Quelport(resp); printf("\nle numero de port apres la fonction est: %d",port); if((sock_data=socket(AF_INET,SOCK_STREAM,0))<0)//ouverture socket pour la data { perror("sock");//renvoi du code d'erreur return 1; } dest_data.sin_family = AF_INET;//Pour préciser que c'est une communication réseau dest_data.sin_port = htons(port); //Préciser le numéro de port soit le 21 pour envoyer des commandes bcopy(h->h_addr,(struct sockaddr *)&dest_data.sin_addr,h->h_length);//mettre l'adresse de destination dans la struct sockaddr_in if(connect(sock_data,(struct sockaddr *)&dest_data, sizeof(struct sockaddr))<0)//connection au serveur pour la data { printf("\nerreur flux données"); perror("connect");//renvoi du code d'erreur return 2; } write(sock,"LIST\r\n",6); taille=read(sock,resp,sizeof(resp)); for(i=0;i<taille;i++) printf("%c",resp[i]); write(sock_data,buf,sizeof(buf)); printf("\n%s",buf); }
[root@localhost socket]# ./main 220 TYPSoft FTP Server 1.10 ready... 331 Password required for anek. 230 User anek logged in. 215 UNIX Type: L8 227 Entering Passive Mode (192,168,1,42,13,21). le numero de port apres la fonction est: 1321 connect: Connection refused
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question