Files

110 lines
3.6 KiB
C
Raw Permalink Normal View History

2026-05-28 08:48:01 +08:00
#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 <host><port>\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);
}