📄 ftpclient.c
字号:
if(send_cmd(cmd_line,ftp_info) == -1){
return -1;
}
if(recv_response(ftp_info) != 250){
return -1;
}
return 0;
}
static int deal_cmd_get(char *filename,ftpc_ctrl *ftp_info)
{
int retval = 0,fd;
char cmd_to_server[64];
char buffer[FTPC_MAX_DATA_LEN];
if(ftp_info->open_mode == MODE_PASSIVE){
if(go_passive(ftp_info) == -1){
return -1;
}
}
sprintf(cmd_to_server,"RETR %s\r\n",filename);
if(send_cmd(cmd_to_server,ftp_info) == -1){
return -1;
}
if(recv_response(ftp_info) != 150){
return -1;
}
printf("%s\n",server_response);
fd = open(filename,O_RDWR | O_CREAT | O_TRUNC,0666);
do{
retval = recv_data(buffer,ftp_info);
if(retval > 0){
write(fd,buffer,retval);
}
}while(retval > 0);
first_recv = TRUE;
close(ftp_info->data_fd);
close(fd);
ftp_info->data_fd = -1;
return retval;
}
static int deal_cmd_put(char *filename,ftpc_ctrl *ftp_info)
{
int retval = 0,fd,n_read;
char cmd_to_server[64];
char buffer[FTPC_MAX_DATA_LEN];
struct stat st;
if(access(filename,F_OK) == -1){
printf("file[%s] not exist!\n",filename);
return -1;
}
stat(filename,&st);
if(!S_ISREG(st.st_mode)){
printf("file[%s] not a common file!\n",filename);
return -1;
}
if((st.st_mode & S_IRUSR) != S_IRUSR){
printf("you do not have the permission of file[%s]\n",filename);
return -1;
}
if(ftp_info->open_mode == MODE_PASSIVE){
if(go_passive(ftp_info) == -1){
return -1;
}
}
sprintf(cmd_to_server,"STOR %s\r\n",filename);
if(send_cmd(cmd_to_server,ftp_info) == -1){
return -1;
}
if(recv_response(ftp_info) != 150){
return -1;
}
printf("%s\n",server_response);
fd = open(filename,O_RDONLY);
do{
n_read = read(fd,buffer,1024);
retval = send_data(buffer,ftp_info,n_read);
}while((n_read > 0)&&(retval > 0));
first_recv = TRUE;
close(ftp_info->data_fd);
close(fd);
recv_response(ftp_info);
ftp_info->data_fd = -1;
return retval;
}
static int deal_cmd_pwd(ftpc_ctrl *ftp_info)
{
send_cmd("PWD\r\n",ftp_info);
if(recv_response(ftp_info) != 257){
return -1;
}
return 0;
}
static int deal_cmd_quit(ftpc_ctrl *ftp_info)
{
send_cmd("QUIT\r\n",ftp_info);
if(recv_response(ftp_info) != 221){
ftp_info->connected = FALSE;
return -1;
}
ftp_info->connected = FALSE;
return 0;
}
static int deal_cmd_bye(ftpc_ctrl *ftp_info)
{
send_cmd("QUIT\r\n",ftp_info);
if(recv_response(ftp_info) != 221){
ftp_info->connected = FALSE;
return -1;
}
ftp_info->connected = FALSE;
return 0;
}
int ftpc_init(ftpc_ctrl *ftp_info)
{
if(ftp_info == NULL){
return -1;
}
chdir(DEFAULT_LOCAL_MENU);
ftp_info->open_mode = MODE_PASSIVE;
ftp_info->connected = FALSE;
ftp_info->ctrl_fd = socket(AF_INET,SOCK_STREAM,0);
ftp_info->data_fd = -1;
return 0;
}
int ftpc_connect_svr(char *svr_ip,uint16 svr_port,ftpc_ctrl *ftp_info)
{
int count,retval;
struct sockaddr_in sa;
if((svr_ip == NULL) || (ftp_info == NULL)){
return -1;
}
printf("connect to server......\n");
memset(&sa,0,sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = htons(svr_port);
sa.sin_addr.s_addr = inet_addr(svr_ip);
ftp_info->connected = FALSE;
setlock(ftp_info->ctrl_fd,FALSE);
for(count=0;count<FTPC_CONNECT_AGAIN_COUNT;count++){
retval = connect(ftp_info->ctrl_fd,(struct sockaddr *)&sa,sizeof(sa));
if(retval == 0){
break;
}
if(retval == -1){
if(errno == 115){
continue;
}
else{
return -1;
}
}
}
setlock(ftp_info->ctrl_fd,TRUE);
if(count<FTPC_CONNECT_AGAIN_COUNT){
if(recv_response(ftp_info) == 220){
printf("%s\n",server_response);
ftp_info->connected = TRUE;
return 0;
}
else{
printf("the server may be shuted down,please try later!\n");
}
}
return -1;
}
int ftpc_login_svr(char *usr_name,char *usr_passwd,ftpc_ctrl *ftp_info)
{
char name_buf[32];
char passwd_buf[32];
int res_code;
if((usr_name == NULL) || (usr_passwd == NULL) || (ftp_info == NULL)){
return -1;
}
sprintf(name_buf,"USER %s\r\n",usr_name);
send_cmd(name_buf,ftp_info);
if(recv_response(ftp_info) == -1){
return -1;
}
else{
printf("%s\n",server_response);
res_code = get_res_code();
if(res_code != 331){
return -1;
}
}
sprintf(passwd_buf,"PASS %s\r\n",usr_passwd);
send_cmd(passwd_buf,ftp_info);
if(recv_response(ftp_info) == -1){
return -1;
}
else{
printf("%s\n",server_response);
res_code = get_res_code();
if(res_code != 230){
return -1;
}
}
return 0;
}
int ftpc_deal_cmd(char *cmd,char *param,ftpc_ctrl *ftp_info,char *msg_to_user)
{
if((cmd == NULL) || (msg_to_user == NULL)){
return -1;
}
if(strcmp(cmd,"lcd") == 0){
if(deal_cmd_lcd(param,ftp_info) == -1){
strcpy(msg_to_user,server_response);
return -1;
}
else{
strcpy(msg_to_user,server_response);
return 0;
}
}
if(strcmp(cmd,"bye") == 0){
if(deal_cmd_bye(ftp_info) == -1){
sprintf(msg_to_user,"command \"%s\" implement error",cmd);
return -1;
}
else{
strcpy(msg_to_user,server_response);
return 0;
}
}
if(strcmp(cmd,"quit") == 0){
if(deal_cmd_quit(ftp_info) == -1){
sprintf(msg_to_user,"command \"%s\" implement error",cmd);
return -1;
}
else{
strcpy(msg_to_user,server_response);
return 0;
}
}
if(strcmp(cmd,"pwd") == 0){
if(deal_cmd_pwd(ftp_info) == -1){
sprintf(msg_to_user,"command \"%s\" implement error",cmd);
return -1;
}
else{
strcpy(msg_to_user,server_response);
return 0;
}
}
if(strcmp(cmd,"help") == 0){
ftpc_help();
strcpy(msg_to_user,server_response);
return 0;
}
if((strcmp(cmd,"ls") == 0) || (strcmp(cmd,"dir") == 0)){
if(deal_cmd_ls(ftp_info) == -1){
sprintf(msg_to_user,"command \"%s\" implement error",cmd);
return -1;
}
else{
strcpy(msg_to_user,server_response);
return 0;
}
}
if(strcmp(cmd,"get") == 0){
if(deal_cmd_get(param,ftp_info) == -1){
sprintf(msg_to_user,"command \"%s\" implement error",cmd);
return -1;
}
else{
strcpy(msg_to_user,server_response);
return 0;
}
}
if(strcmp(cmd,"put") == 0){
if(deal_cmd_put(param,ftp_info) == -1){
strcpy(msg_to_user,server_response);
return -1;
}
else{
strcpy(msg_to_user,server_response);
return 0;
}
}
if(strcmp(cmd,"cd") == 0){
if(deal_cmd_cd(param,ftp_info) == -1){
strcpy(msg_to_user,server_response);
return -1;
}
else{
strcpy(msg_to_user,server_response);
return 0;
}
}
if(strcmp(cmd,"del") == 0){
if(deal_cmd_del(param,ftp_info) == -1){
sprintf(msg_to_user,"command \"%s\" implement error",cmd);
return -1;
}
else{
strcpy(msg_to_user,server_response);
return 0;
}
}
if(strcmp(cmd,"mkdir") == 0){
if(deal_cmd_mkdir(param,ftp_info) == -1){
sprintf(msg_to_user,"command \"%s\" implement error",cmd);
return -1;
}
else{
strcpy(msg_to_user,server_response);
return 0;
}
}
if(strcmp(cmd,"rmdir") == 0){
if(deal_cmd_rmdir(param,ftp_info) == -1){
sprintf(msg_to_user,"command \"%s\" implement error",cmd);
return -1;
}
else{
strcpy(msg_to_user,server_response);
return 0;
}
}
if(strcmp(cmd,"localshow") == 0){
if(deal_cmd_lcshow() == -1){
sprintf(msg_to_user,"command \"%s\" implement error",cmd);
return -1;
}
else{
strcpy(msg_to_user,server_response);
return 0;
}
}
sprintf(msg_to_user,"what???I don't recognize the command[%s]!please input \"help\"!",cmd);
return -1;
}
int ftpc_close(ftpc_ctrl *ftp_info)
{
if(ftp_info == NULL){
return -1;
}
ftp_info->connected = FALSE;
if(ftp_info->ctrl_fd){
shutdown(ftp_info->ctrl_fd,2);
close(ftp_info->ctrl_fd);
ftp_info->ctrl_fd = -1;
}
if(ftp_info->data_fd){
shutdown(ftp_info->data_fd,2);
close(ftp_info->data_fd);
ftp_info->data_fd = -1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -