📄 function.c
字号:
//printf("lastline=2\n"); } else lastline=0; } if(lastline==0 && reply_buf[i]==c_reply_code[0]) { lastline=1; //printf("lastline=1\n"); } } //end for if(flag==1) break; else reply_length=read(sockfd, reply_buf, REPLY_BUFFER_SIZE-2); } return reply_code;}//-------------------------------------------------------------------------------------------------int send_cmd(char *cmd, char *para, int sockfd) //从已经连接的sockfd中发送命令和参数 函数返回实际发送的字节数{ int send_length; if(cmd) { strcpy(send_buf, cmd); if(para) { strcat(send_buf,para); strcat(send_buf,"\r\n"); } else strcat(send_buf,"\r\n"); cmd_length=strlen(send_buf); printf("%s",send_buf); //把要发出的命令输出 send_length=write(sockfd, send_buf, cmd_length); if(send_length<0) { printf("Send error.\n"); } return send_length; } return -1;}//-------------------------------------------------------------------------------------------------int get_data(int in, int out){ int new_sockfd = in; if(passive == 0) //PORT { new_sockfd = port_accept(in); if(new_sockfd<0) { return -1; } } while(1) { data_length=read(new_sockfd, data_buf, DATA_BUFFER_SIZE); if(data_length<=0) break; else write(out, data_buf, data_length); } if(passive == 0) close(new_sockfd); return 0;}//-------------------------------------------------------------------------------------------------int cmd_format(char *cmd) //将cmd整理。 返回参数的个数(包括命令本身){ int num=0; int i=0, j=0; for(i=0;cmd[i]!='\n';i++) { if(cmd[i]!=' ') { if(i==0) num++; if(i!=0 && cmd[i-1]==' ') { cmd[j]=' '; j++; num++; } cmd[j]=cmd[i]; j++; } } cmd[j]='\0'; return num;}//-------------------------------------------------------------------------------------------------char *my_itoa(int i){ char *a=malloc(42); //enough for a 128 bit integer if(a) sprintf(a,"%d",i); return a;}//-------------------------------------------------------------------------------------------------int get_ip(char *ip) // include <ioctl.h>{ int sock; struct sockaddr_in sin; struct ifreq ifr; sock=socket(AF_INET,SOCK_DGRAM,0); if(sock==-1) { perror("socket"); return -1; } strncpy(ifr.ifr_name, ETH_NAME, IFNAMSIZ); ifr.ifr_name[IFNAMSIZ-1]=0; if(ioctl(sock,SIOCGIFADDR,&ifr)<0) { perror("ioctl"); return -1; } memcpy(&sin, &ifr.ifr_addr, sizeof(sin)); //fprintf(stdout,"eth0: %s\n",inet_ntoa(sin.sin_addr)); ip=strcpy(ip, inet_ntoa(sin.sin_addr)); return 0;}//-------------------------------------------------------------------------------------------------int rand_local_port(){ int port; srand((unsigned)time(NULL)); port = rand() % 40000 + 1025; return port;}//-------------------------------------------------------------------------------------------------int create_datasock(){ if(passive==1) //pasv 先发送pasv命令到服务器,然后建立一个数据sockfd和收到的地址连接上去。 { char *temp; int data_port; int client_data_sockfd; // 向服务器发送pasv 获取服务器的数据端口号 保存在data_port send_cmd("PASV",NULL, client_sockfd); //进入被动模式 //reply_length=recv(client_sockfd, reply_buf, REPLY_BUFFER_SIZE,0); reply_length=get_reply(client_sockfd); if(reply_length<0) return 0; reply_buf[reply_length]='\0'; if(atoi(reply_buf)==227) //说明进入了被动模式 { temp=strrchr(reply_buf,','); //strrchr()函数的作用是:查找一个字符串在另一个字符串中末次出现的位置. data_port=atoi(temp+1); *temp='\0'; temp=strrchr(reply_buf,','); data_port+=atoi(temp+1)*256; } //printf("data_port: %d", data_port); //将server_addr的端口号改成数据端口号 if(data_port!=0) server_addr.sin_port=htons(data_port); //新建一个client_data_sockfd和server_addr连接connect client_data_sockfd=socket(AF_INET,SOCK_STREAM,0); if(client_data_sockfd<0) { printf("create client_data_sockfd failed."); return -1; } if(connect(client_data_sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr))<0) { printf("cannot connect to the server: %s, port:%d\n",inet_ntoa(server_addr.sin_addr),ntohs(server_addr.sin_port)); close(client_data_sockfd); return -1; } return client_data_sockfd; } //end if(passive==1) else //port 客户端设定一个数据端口,然后建立一个数据socket和该端口绑定,然后给服务器发送port命令 该命令包含客户端接受数据的端口。 { //建立一个数据socket int client_data_sockfd; int i; client_data_sockfd=socket(AF_INET,SOCK_STREAM,0); if(client_data_sockfd<0) { printf("create client_data_sockfd failed."); return -1; } //为客户端地址client_addr随机选取一个地址 //int data_port=rand_local_port(); bzero(&client_addr, sizeof(client_addr)); client_addr.sin_family=AF_INET; //TCP/IP协议族 client_addr.sin_addr.s_addr=htonl(INADDR_ANY); //地址为本机ip client_addr.sin_port=0; //端口为随机选取 if(bind(client_data_sockfd, (struct sockaddr *)&client_addr, sizeof(client_addr))<0) { perror("bind"); return -1; } if(listen(client_data_sockfd,3)<0) { perror("listen"); return -1; } int len = sizeof(client_addr); getsockname(client_data_sockfd, (struct sockaddr*)&client_addr, &len); unsigned int ip; unsigned short port; ip = ntohs(client_addr.sin_addr.s_addr); port = ntohs(client_addr.sin_port); char address[24]; address[0] = '\0'; strcat(address, my_itoa((int)((ip>>24)&0xff)) ); strcat(address, ","); strcat(address, my_itoa((int)((ip>>16)&0xff)) ); strcat(address, ","); strcat(address, my_itoa((int)((ip>>8)&0xff)) ); strcat(address, ","); strcat(address, my_itoa((int)((ip)&0xff)) ); strcat(address, ","); strcat(address, my_itoa((int)((port>>8)&0xff)) ); strcat(address, ","); strcat(address, my_itoa((int)((port)&0xff)) ); send_cmd("PORT ", address, client_sockfd); if(get_reply(client_sockfd)!=200) { printf("can not use PORT mode! Please use \"passive\" change to PASV mode.\n"); return -1; } else return client_data_sockfd; //} //end while close(client_data_sockfd); return -1; } //end else (PORT mode)}//-------------------------------------------------------------------------------------------------int port_accept(int client_data_sockfd) // 在port模式下时候用来accept对方的connect后建立数据通路 返回新的数据的sockfd{ int set=sizeof(client_addr); int new_sockfd=accept(client_data_sockfd, (struct sockaddr*) &client_addr, (socklen_t *)&set); // new_sockfd是用于port模式下accept对方的connect后建立数据通路的。 if(new_sockfd<0) { printf("Sorry you can't use PORT mode..\n"); //close(new_sockfd); close(client_data_sockfd); return -1; } close(client_data_sockfd); return new_sockfd;}//-------------------------------------------------------------------------------------------------void show_command(){ printf("bye: terminate ftp session and exit\n"); printf("cd remote-directory: change remote working directory\n"); printf("close: terminate ftp session\n"); printf("delete remote-file: delete remote file\n"); printf("get remote-file [local-file]: receive file\n"); printf("help: print local help information\n"); printf("lcd local-directory: change local working directory\n"); printf("ldir: list contents of local directory\n"); printf("lmkdir directory-name: make directory on the local machine\n"); printf("lpwd: print local working directory\n"); printf("lrmdir directory-name: remove directory on the local machine\n"); printf("ls: list contents of remote directory\n"); printf("mirror [remote [local]]: receive remote fold\n"); printf("mkdir directory-name: make directory on the remote machine\n"); printf("open host-name [port]: connect to remote ftp\n"); printf("passive: enter passive transfer mode\n"); printf("put local-file [remote-file]: send one file\n"); printf("pwd: printf remote working directory\n"); printf("quit: terminate ftp session and exit\n"); printf("rename from-name to-name: rename file\n"); printf("rmdir directory-name: remove directory on the remote machine\n"); printf("user: send new user information\n"); printf("?: printf local help information\n"); return;}//-------------------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -