#include "common.h" typedef struct ftp_file { char cmd[MAXLINE]; // FTP命令 char filename[MAXLINE]; // 文件名参数 char fileSize[MAXLINE]; // 文件大小参数 } ftp_file_t; int main(int argc, char **argv) { int client_sock, port; char *host, buf[MAXLINE]; rio_t rio; if (argc != 3) { fprintf(stderr, "usage: %s \n", argv[0]); exit(1); } host = argv[1]; port = atoi(argv[2]); client_sock = open_client_sock(host, port); if(client_sock==-1) { fputs("Error to connect the Server\n",stdout); exit(1); } while (fgets(buf, MAXLINE, stdin) != NULL) { ftp_file_t file; FILE *fp; long fileSize; char filePath[MAXLINE] = "./"; // 假设当前目录下有文件 char *token = strtok(buf, " \t\n"); // 提取FTP命令 if (strcmp(token, "get") == 0 || strcmp(token, "put") == 0) { strncpy(file.cmd, token, MAXLINE - 1); file.cmd[MAXLINE - 1] = '\0'; } else { printf("Unsupported command: %s\n", token); continue; // 如果不是get或put命令,跳过处理 } token = strtok(NULL, " \t\n"); // 提取文件名参数 if (token != NULL) { strncpy(file.filename, token, MAXLINE - 1); file.filename[MAXLINE - 1] = '\0'; } else { printf("Filename is required for command: %s\n", file.cmd); continue; // 如果没有提供文件名参数,跳过处理 } if (strcmp(file.cmd,"put")==0) { strcat(filePath, file.filename); // 构建完整文件路径 fp = fopen(filePath, "r"); if (fp == NULL) { perror("Error opening file"); continue; } else { fseek(fp, 0, SEEK_END); fileSize = ftell(fp); fclose(fp); snprintf(file.fileSize, MAXLINE, "%ld", fileSize); // 将文件大小转换为字符串并存储 } send(client_sock, &file, sizeof(ftp_file_t), 0); fp = fopen(filePath, "r"); if (fp == NULL) { perror("Error opening file for reading"); } else { char *fileContent = malloc(fileSize); fread(fileContent, 1, fileSize, fp); // 从文件中读取内容到缓冲区 send(client_sock, fileContent, fileSize, 0); // 发送文件内容 free(fileContent); recv(client_sock, buf, MAXLINE, 0); fputs(buf, stdout); fclose(fp); } } else if (strcmp(file.cmd,"get")==0) { send(client_sock, &file, sizeof(ftp_file_t), 0); recv(client_sock, &file, sizeof(ftp_file_t), 0); // 接收文件信息 int fileSize = atoi(file.fileSize); if (fileSize > 0) { char *fileContent = malloc(fileSize); // 根据文件大小分配内存 recv(client_sock, fileContent, fileSize, 0); // 接收文件内容 FILE *fp = fopen(file.filename, "w"); if (fp != NULL) { fwrite(fileContent, 1, fileSize, fp); // 将接收到的内容写入文件 fclose(fp); } else { perror("Error creating file"); } free(fileContent); // 释放内存 } recv(client_sock, buf, MAXLINE, 0); fputs(buf, stdout); } } close(client_sock); exit(0); }