【Linux】FTP文件下载
生活随笔
收集整理的這篇文章主要介紹了
【Linux】FTP文件下载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼來源于網絡,記錄下,方便日后使用(適用于Linux平臺)
/*使用FTP協議獲取服務器上的文件(Passive方式) 1 在客戶端創建一個SOCK_STREAM類型的套接字,并與FTP服務器端的21號命令端口連接(因為FTP服務器的21號端口在偵聽); 2 再創建一個SOCK_STREAM類型的數據套接字,準備與FTP服務器端的數據端口進行通信(因為是Passive方式,所以服務器端的數據端口不是20號了) 3 發送用戶名、密碼到21號命令端口 4 發送PASV,從返回的字符串里取出的服務器上的數據端口號,然后客戶端通過connect與該端口進行連接(此時服務器端的數據端口在偵聽) 5 然后客戶端就可以通過這兩個套接字與服務器端進行通信了使用FTP協議獲取服務器上的文件(Port方式) 1 在客戶端創建一個SOCK_STREAM類型的套接字,并與FTP服務器端的21號命令端口連接(因為FTP服務器的21號端口在偵聽); 2 再創建一個SOCK_STREAM類型的數據套接字,準備與FTP服務器端的數據端口進行通信(因為是Port方式,所以服務器端的數據端口是20號) 3 綁定本地地址和數據套接字,然后就偵聽,并等待服務器來連接(此時客戶端的數據套接字要listen和accept) 3 發送用戶名、密碼到21號命令端口 4 發送PORT,等待服務器的數據端口來連接 5 連接成功后,客戶端就可以通過這兩個套接字與服務器端進行通信了我這個程序是在linux下運行的; 在我的程序中:用戶名是leetow,口令是leetow,FTP服務器的IP是192.168.1.90; 程序運行格式:程序名 要下載的文件名*/#include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <errno.h> #include <stdio.h> #include <strings.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> #include <netdb.h>#define FTP_SERVER "192.168.1.90"int main(int argc,char* argv[]) {int sk_data,sk_ctrl; //客戶端的兩個套接字,分別與服務器端的數據端口、命令端口端口進行通信struct sockaddr_in addr_data,addr_ctrl; //服務器的兩個地址,分別與客戶端的數據端口、命令端口端口進行通信struct in_addr inp;//我這里的用戶名是leetow,口令是leetowchar bufrecv[100],user[]="USER leetow\r\n",passwd[]="PASS leetow\r\n",pasv[]="PASV\r\n";char size[30]="SIZE ",type[]="TYPE A\r\n",download[30]="RETR ",quit[100]="QUIT\r\n",line_end[]="\r\n";char filebuf[50000],str[100]; //文件緩沖區int lensnd,lenrecv,err;int a1,a2,a3,a4,p1,p2;//從服務器返回的地址和端口FILE *fp;int len;//獲得文件名if(argc!=2){printf("Usage:%s filename \n", argv[0]);return -1;}//補齊文件大小與下載文件的命令strcat(size,argv[1]);strcat(size,line_end);strcat(download,argv[1]);strcat(download,line_end);//create two socket for SOCK_STREAMsk_data=socket(AF_INET,SOCK_STREAM,0);sk_ctrl=socket(AF_INET,SOCK_STREAM,0);if(sk_data<0 ){perror("creat socket sk_data error");return -1;}if(sk_ctrl < 0 ){perror("creat socket sk_ctrl error");close(sk_data);return -1;}//與服務器上的21號端口連接bzero(&addr_ctrl,sizeof(struct sockaddr_in));inet_aton(FTP_SERVER, &inp); //服務器IP地址addr_ctrl.sin_family=AF_INET;addr_ctrl.sin_addr=inp;addr_ctrl.sin_port=htons(21); //FTP命令端口//connect to servererr=connect(sk_ctrl,(struct sockaddr*)&addr_ctrl,sizeof(struct sockaddr));if(-1==err){perror("connect 21 error");close(sk_data);close(sk_ctrl);return -1;}//輸出服務器端的連接成功的信息bzero(bufrecv,100);lenrecv=recv(sk_ctrl,bufrecv,100,0);if(lenrecv>0){printf("connect 21 successfully:%s\n",bufrecv);}//發送用戶名lensnd=send(sk_ctrl,user,strlen(user),0);if(lensnd>0){bzero(bufrecv,100);recv(sk_ctrl,bufrecv,100,0);printf("user name:%s\n",bufrecv);}//發送口令lensnd=send(sk_ctrl,passwd,strlen(passwd),0);if(lensnd>0){bzero(bufrecv,100);recv(sk_ctrl,bufrecv,100,0);printf("password:%s\n",bufrecv);}//PASVlensnd=send(sk_ctrl,pasv,strlen(pasv),0);if(lensnd>0){bzero(bufrecv,100);recv(sk_ctrl,bufrecv,100,0);printf("pasv:%s\n",bufrecv);sscanf(bufrecv,"%*[^(]%[^)]",str); //字符串中從"("開始一直到")"之間的字符存到str中,包括"("sscanf(str,"(%d,%d,%d,%d,%d,%d",&a1,&a2,&a3,&a4,&p1,&p2);printf("p1,p2=%d,%d\n",p1,p2);printf("p1*256+p2=%d\n",p1*256+p2);}//指定服務器的數據端口bzero(&addr_data,sizeof(struct sockaddr_in));inet_aton(FTP_SERVER, &inp); //服務器IP地址addr_data.sin_family=AF_INET;addr_data.sin_addr=inp;addr_data.sin_port=htons(p1*256+p2);err=connect(sk_data,(struct sockaddr*)&addr_data,sizeof(struct sockaddr));if(-1==err){perror("connect 20 error");close(sk_data);close(sk_ctrl);return -1;}//獲得文件大小lensnd=send(sk_ctrl,size,strlen(size),0);if(lensnd>0){bzero(bufrecv,100);recv(sk_ctrl,bufrecv,100,0);printf("sz:%s\n",bufrecv);sscanf(bufrecv,"%d %d",&a1,&len);printf("a1,len=%d,%d\n",a1,len);}//從服務器上獲得文件lensnd=send(sk_ctrl,download,strlen(download),0);if(lensnd>0){bzero(bufrecv,100);recv(sk_ctrl,bufrecv,100,0);printf("get file:%s\n",bufrecv);}//本地建文件并寫入數據fp=fopen(argv[1],"w");if(NULL==fp){printf("fopen error:\n");close(sk_data);close(sk_ctrl);return -1;}lenrecv=recv(sk_data,filebuf,len,0);if(lenrecv>0){fwrite(filebuf,len,1,fp);fclose(fp);}//退出lensnd=send(sk_ctrl,quit,strlen(quit),0);if(lensnd>0){bzero(bufrecv,100);recv(sk_ctrl,bufrecv,100,0);printf("quit:%s\n",bufrecv);printf("send qexit successful\n");}close(sk_data);close(sk_ctrl);return 0; }
Makefile
運行
?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【Linux】FTP文件下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql中两个字符串相加
- 下一篇: 招聘PHP聚合系统,Thinkphp5开