linux 下简单的ftp客户端程序
生活随笔
收集整理的這篇文章主要介紹了
linux 下简单的ftp客户端程序
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
該ftp的客服端是在linux下面寫,涉及的東西也比較簡單,如前ftp的簡單介紹,知道ftp主要的工作流程架構(gòu),套接字的創(chuàng)建,還有就是字符串和字符的處理。使用的函數(shù)都是比較簡單平常易見的,寫的時(shí)候感覺有將以前學(xué)的函數(shù)從新鞏固一遍。這個(gè)簡易的ftp客服端只是完成了基本的工作,還有許多的問題有待解決。如:目前最大的問題是使用pasv(被動模式)連接的時(shí)候,某些情況下會出現(xiàn)運(yùn)行錯(cuò)誤或同一個(gè)運(yùn)行程序中使用兩次pasv的被動連接就是出現(xiàn)運(yùn)行錯(cuò)誤而退出。注意:ftp的測試最好是用linux平臺下搭建,連接編碼不同ftp會出現(xiàn)錯(cuò)誤。
轉(zhuǎn)載請標(biāo)明出處 代碼如下: /************************* 方便測試ftp:172.16.120.77 author:fengbo *************************/ #include<stdio.h> #include<stdlib.h> #include<sys/socket.h> #include<string.h> #include<sys/stat.h> #include<sys/types.h> #include<fcntl.h> #include<netinet/in.h> #include<unistd.h> #include<netdb.h> #include<curses.h> #defineMAXSIZE1024 #definebuff512 char*data_port; intport; char*p,*ptr; intc_sockfd,d_sockfd; intread_status,write_status; // charread_buf[200];//控制端口緩存 charread_d_buf[512];//數(shù)據(jù)端口緩存 charsend_buf[100]; charcommand[40]; charcom_input[15];//輸入字符緩存 charpara_input[20]; structsockaddr_inserveraddr_d; /// staticvoiddisplay_order();//命令提示 staticvoidftp_d_port();//pasv獲得端口 staticvoidftp_c_socket(intargc1,char**argv1);//命令端口創(chuàng)建 staticvoidftp_d_socket(char*argv2);//數(shù)據(jù)端口創(chuàng)建 staticvoidset_pasv(char*argv3);//設(shè)置被動模式 /// staticvoidftp_c_socket(intargc1,char**argv1){ intret,i,com_len=0; intcom_i=0,para_i=0; into_file,r_file,w_file;//文件的描述符 char*com_status,*para_status; structsockaddr_inserveraddr_c;//網(wǎng)絡(luò)字節(jié)序序存的結(jié)構(gòu)體變量 socklen_tsock_size; chardir_name[15];//dir的當(dāng)前目錄 charfile_name[20]; charusername[20]; charpassword[20]; charcatalog[20];//需要cd的目錄 chardownload_file[20]; charmkdir_catalog[20];//創(chuàng)建目錄 / sock_size=sizeof(structsockaddr); serveraddr_c.sin_family=AF_INET; serveraddr_c.sin_port=htons(21); serveraddr_c.sin_addr.s_addr=inet_addr(argv1[1]); memset(&(serveraddr_c.sin_zero),0,8); c_sockfd=socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建sock套接字 if(c_sockfd<0){ perror("creatsocketerror!\n"); return; } ret=connect(c_sockfd,(structsockaddr*)&serveraddr_c,sock_size); if(ret<0){ perror("connecterror!\n"); return; } printf("connecttheserverFTPsuccessfully!\n"); read_status=read(c_sockfd,read_buf,sizeof(read_buf));//讀取ftp的鏈接歡迎信息 if(read_status==-1){ perror("errortogaintheftpwelconmeinformation!\n"); } printf("theinformation:%s\n",read_buf); /login// printf("--------------------------pleasetologin--------------------------\n"); printf("\n"); printf("***username:"); scanf("%s",username); getchar(); printf("\n"); printf("***password:"); scanf("%s",password); getchar(); printf("\n"); printf("--------------------------------------------------------------------\n"); ///username// memset(read_buf,0,sizeof(read_buf)); sprintf(send_buf,"USER%s\r\n",username); write_status=write(c_sockfd,send_buf,strlen(send_buf)); if(write_status==-1){ perror("failuretosendtheusername\n"); } read_status=read(c_sockfd,read_buf,sizeof(read_buf));//讀取ftp用戶鏈接的返回信息 if(read_status==-1){ perror("errortogaintheftpinformation!\n"); } if(atoi(read_buf)!=331){ printf("errortologintheftp'username'\n"); } printf("theinformation:%s\n",read_buf); /password// memset(send_buf,0,sizeof(send_buf)); memset(read_buf,0,sizeof(read_buf)); sprintf(send_buf,"PASS%s\r\n",password); write_status=write(c_sockfd,send_buf,strlen(send_buf)); if(write_status==-1){ perror("failuretosendthepassword\n"); } read_status=read(c_sockfd,read_buf,sizeof(read_buf));//讀取ftp用戶鏈接的返回信息 if(read_status==-1){ perror("errortogaintheftpinformation!\n"); } if(atoi(read_buf)!=230){ printf("errortologintheftp'password'\n"); exit(-1); } printf("theinformation:%s\n",read_buf); ///設(shè)置PASV模式/ //set_pasv(); ///獲取端口函數(shù)/ //ftp_d_port(); 發(fā)送數(shù)據(jù)端口請求/ //ftp_d_socket(argv1[1]); //displaythecommand display_order(); ///命令控制// while(1){ printf("%sftp>",username); scanf("%s",command);//從鍵盤獲取命令和參數(shù) getchar(); com_len=strlen(command);//長度 if(com_len>5){ com_status=strstr(command,"-");//取命令和參數(shù)分界點(diǎn) while(command[com_i]!=*com_status){ com_input[com_i]=command[com_i]; com_i++; }//獲取到命令 //printf("%s\n",com_input); com_status++; for(para_i=0;para_i<=(com_len-com_i-1);para_i++){ para_input[para_i]=*com_status; com_status++; }//獲取到參數(shù) //printf("%s\n",para_input); com_i=0; } else{ strcpy(com_input,command); } //大小寫轉(zhuǎn)換/// /*for(i=0;i<strlen(command);i++){ if(strcmp("command[i]","a")>=0){ command[i]=(command[i]-32); } }*/ set_pasv(argv1[1]); if(strcmp(com_input,"PWD")==0){ ///當(dāng)前路徑/ memset(read_buf,0,sizeof(read_buf)); memset(send_buf,0,sizeof(send_buf)); sprintf(send_buf,"PWD\r\n"); write_status=write(c_sockfd,send_buf,strlen(send_buf));//命令寫入控制套接連接 if(write_status==-1){ perror("failuretosendtheinformationfor'PWD'\n"); } read_status=read(c_sockfd,read_buf,sizeof(read_buf));//讀取ftp用戶鏈接的返回信息 if(read_status==-1){ perror("errortogaintheftpinformation!\n"); } //if(atoi(read_buf)!=257){ //printf("errortosetthePASVmodel\n"); //} printf("%s\n",read_buf); } elseif(strcmp(com_input,"DIR")==0){ ///顯示目錄文件/// memset(read_buf,0,sizeof(read_buf)); memset(send_buf,0,sizeof(send_buf)); strcpy(dir_name,para_input); sprintf(send_buf,"LIST%s\r\n",dir_name); write_status=write(c_sockfd,send_buf,strlen(send_buf));//命令寫入控制套接連接 if(write_status==-1){ perror("failuretosendtheinformationfor'LIST'\n"); } read_status=read(c_sockfd,read_buf,sizeof(read_buf));//讀取ftp用戶鏈接的返回信息 if(read_status==-1){ perror("errortogaintheftpinformation!\n"); } printf("%s\n",read_buf); //if(atoi(read_buf)!=){ //printf("errortosetthePASVmodel\n"); //} memset(read_d_buf,0,sizeof(read_d_buf)); while(read(d_sockfd,read_d_buf,sizeof(read_d_buf))>0){ printf("%s",read_d_buf); memset(read_d_buf,0,sizeof(read_d_buf)); } close(d_sockfd); memset(&serveraddr_d,0,sizeof(serveraddr_d)); } elseif(strcmp(com_input,"QUIT")==0){ /退出/ close(d_sockfd); printf("數(shù)據(jù)端口已關(guān)閉\n"); memset(read_buf,0,sizeof(read_buf)); memset(send_buf,0,sizeof(send_buf)); sprintf(send_buf,"QUIT\r\n"); write_status=write(c_sockfd,send_buf,strlen(send_buf));//命令寫入控制套接連接 if(write_status==-1){ perror("failuretosendtheinformationfor'RETR'\n"); } read_status=read(c_sockfd,read_buf,sizeof(read_buf));//讀取ftp用戶鏈接的返回信息 if(read_status==-1){ perror("errortogaintheftpinformation!\n"); } //if(atoi(read_buf)!=257){ //printf("errortosetthePASVmodel\n"); //} printf("%s\n",read_buf); break; } elseif(strcmp(com_input,"GET")==0){ /下載文件/ memset(read_buf,0,sizeof(read_buf)); memset(send_buf,0,sizeof(send_buf)); memset(read_d_buf,0,sizeof(read_d_buf)); strcpy(download_file,para_input); sprintf(send_buf,"RETR%s\r\n",download_file); write_status=write(c_sockfd,send_buf,strlen(send_buf)); if(write_status==-1){ perror("failuretosendtheinformationfor'RETR'\n"); } read_status=read(c_sockfd,read_buf,sizeof(read_buf));//讀取ftp用戶鏈接的返回信息 if(read_status==-1){ perror("errortogaintheftpinformation!\n"); } //if(atoi(read_buf)!=257){ //printf("errortosetthePASVmodel\n"); //} printf("%s\n",read_buf); o_file=open(download_file,O_WRONLY|O_CREAT|O_TRUNC,0644);//創(chuàng)建文件客服端 if(o_file==-1){ printf("errortoopenthe%s\n",file_name); exit(-1); } while((r_file=read(d_sockfd,read_d_buf,sizeof(read_d_buf)))>0){ write(o_file,read_d_buf,r_file);//寫入文件 memset(read_d_buf,0,sizeof(read_d_buf)); } printf("transportthefilesuccessfuly!\n"); close(o_file); close(d_sockfd); memset(&serveraddr_d,0,sizeof(serveraddr_d)); } elseif(strcmp(com_input,"CD")==0){ ///跳轉(zhuǎn)目錄/ memset(read_buf,0,sizeof(read_buf)); memset(send_buf,0,sizeof(send_buf)); strcpy(catalog,para_input); sprintf(send_buf,"CWD%s\r\n",catalog); write_status=write(c_sockfd,send_buf,strlen(send_buf));//命令寫入控制套接連接 if(write_status==-1){ perror("failuretosendtheinformationfor'DELE'\n"); } read_status=read(c_sockfd,read_buf,sizeof(read_buf));//讀取ftp用戶鏈接的返回信息 if(read_status==-1){ perror("errortogaintheftpinformation!\n"); } //if(atoi(read_buf)!=257){ //printf("errortosetthePASVmodel\n"); //} printf("%s\n",read_buf); } elseif(strcmp(com_input,"DEL")==0){ ///刪除文件/ memset(read_buf,0,sizeof(read_buf)); memset(send_buf,0,sizeof(send_buf)); strcpy(file_name,para_input); sprintf(send_buf,"DELE%s\r\n",file_name); write_status=write(c_sockfd,send_buf,strlen(send_buf));//命令寫入控制套接連接 if(write_status==-1){ perror("failuretosendtheinformationfor'DELE'\n"); } read_status=read(c_sockfd,read_buf,sizeof(read_buf));//讀取ftp用戶鏈接的返回信息 if(read_status==-1){ perror("errortogaintheftpinformation!\n"); } //if(atoi(read_buf)!=257){ //printf("errortosetthePASVmodel\n"); //} printf("%s\n",read_buf); } elseif(strcmp(com_input,"MKDIR")==0){ ///創(chuàng)建目錄/ memset(read_buf,0,sizeof(read_buf)); memset(send_buf,0,sizeof(send_buf)); strcpy(mkdir_catalog,para_input); sprintf(send_buf,"MKD%s\r\n",mkdir_catalog); write_status=write(c_sockfd,send_buf,strlen(send_buf));//命令寫入控制套接連接 if(write_status==-1){ perror("failuretosendtheinformationfor'DELE'\n"); } read_status=read(c_sockfd,read_buf,sizeof(read_buf));//讀取ftp用戶鏈接的返回信息 if(read_status==-1){ perror("errortogaintheftpinformation!\n"); } //if(atoi(read_buf)!=257){ //printf("errortosetthePASVmodel\n"); //} printf("%s\n",read_buf); } else{ printf("***************thecommanderror!****************\n"); display_order();//顯示命令 } } } //PASV被動模式設(shè)置/ staticvoidset_pasv(char*argv3){ memset(send_buf,0,sizeof(send_buf)); memset(read_buf,0,sizeof(read_buf)); sprintf(send_buf,"PASV\r\n"); write_status=write(c_sockfd,send_buf,strlen(send_buf)); if(write_status==-1){ perror("failuretosendtheinformationfor'PASV'\n"); } read_status=read(c_sockfd,read_buf,sizeof(read_buf));//讀取ftp用戶鏈接的返回信息 if(read_status==-1){ perror("errortogaintheftpinformation!\n"); } printf("%s",read_buf); if(atoi(read_buf)!=227){ printf("errortosetthePASVmodel\n"); } ftp_d_port();//獲取端口 ftp_d_socket(argv3);//數(shù)據(jù)套接字創(chuàng)建 } /獲取端口函數(shù)實(shí)現(xiàn)/// staticvoidftp_d_port(){ char*port_status1,*port_status2,*index,extend,extend_1; intport_temp1[4],port_temp2[4];//當(dāng)時(shí)出現(xiàn)錯(cuò)誤,變量為int型 intport_i=0,port_ii=0,count,count_i,count_ii; inttemp=0,temp1=0,temp2,port_point; port_status1=strstr(read_buf,"(");//取“(”里面的 port_status1++; for(port_point=0;port_point<4;port_point++){//取第4個(gè)逗號位置 port_status2=strstr(port_status1,","); port_status2++; port_status1=port_status2; } port_status2=strstr(port_status1,",");//取第5個(gè)逗號位置 while(port_status1!=port_status2){ extend=*port_status1; port_temp1[port_i]=(int)(extend-48);//獲取5~6逗號間數(shù)據(jù) port_i++; port_status1++; } port_status2++; port_status1=port_status2; port_status2=strstr(port_status1,")");//取")"的位置 while(port_status1!=port_status2){ extend_1=*port_status1; port_temp2[port_ii]=(extend_1-48);//獲得")"之前的數(shù)據(jù) port_ii++; port_status1++; } count_i=port_i; for(count=0;count<port_i;count++){ if(count_i==3){ count_ii=100; } elseif(count_i==2){ count_ii=10; } elseif(count_i==1){ count_ii=1; } temp=temp+port_temp1[count]*count_ii;//計(jì)算p1 count_i--; } count_i=port_ii; for(count=0;count<port_ii;count++){ if(count_i==3){ count_ii=100; } elseif(count_i==2){ count_ii=10; } elseif(count_i==1){ count_ii=1; } temp1=temp1+port_temp2[count]*count_ii;//計(jì)算p2 count_i--; } port=temp*256+temp1;//p1*256+p2 printf("theinformation:%s\n",read_buf); } //命令提示 staticvoiddisplay_order(){ printf("****************************************************\n"); printf("youcaninputtheCommand:\n"); printf("DIR,PWD,GET,PUT,QUIT,CD,DEL,MKDIR\n"); printf("attention:命令和參數(shù)間用'-'分開\n"); printf("****************************************************\n"); } ///數(shù)據(jù)傳送端口 staticvoidftp_d_socket(char*argv2){ intret_d; //structsockaddr_inserveraddr_d; socklen_tsock_d_size; sock_d_size=sizeof(structsockaddr); serveraddr_d.sin_family=AF_INET; serveraddr_d.sin_port=htons(port); serveraddr_d.sin_addr.s_addr=inet_addr(argv2); memset(&(serveraddr_d.sin_zero),0,8); d_sockfd=socket(AF_INET,SOCK_STREAM,0); if(d_sockfd<0){ perror("creatdata_socketerror\n"); exit(-1); } ret_d=connect(d_sockfd,(structsockaddr*)&serveraddr_d,sock_d_size); if(ret_d<0){ perror("data_connecterror!\n"); exit(-1); } printf("connecttheFTPdataportsuccessfully!\n"); } intmain(intargc,char**argv){ ftp_c_socket(argc,argv); return0; }http://xfb2020.blog.163.com/blog/static/198496112201317113750789/
總結(jié)
以上是生活随笔為你收集整理的linux 下简单的ftp客户端程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抖音如何让别人看到我的喜欢
- 下一篇: 飞书okr(汉典飞字的基本解释)