From ec33ea3f7b6f97432b765d2e0336a5235f15ff0f Mon Sep 17 00:00:00 2001 From: ambrumf <421653227@qq.com> Date: Thu, 12 Oct 2023 09:36:30 +0800 Subject: [PATCH] update ftpserver --- .../app_test/test_ftpclient_final/ftpserver.c | 73 +++++++++---------- 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/APP_Framework/Applications/app_test/test_ftpclient_final/ftpserver.c b/APP_Framework/Applications/app_test/test_ftpclient_final/ftpserver.c index a88b9a851..743458666 100644 --- a/APP_Framework/Applications/app_test/test_ftpclient_final/ftpserver.c +++ b/APP_Framework/Applications/app_test/test_ftpclient_final/ftpserver.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -45,40 +46,29 @@ struct LoginStatus { struct User users[MAX_USERS]; struct LoginStatus login_list[MAX_CONNECTION]; - +void GetFullAddress(char *client_id, char *client_ip, int client_port) { + memset(client_id, 0, sizeof(client_id)); + sprintf(client_id, "%s:%d", client_ip, client_port); +} int CheckPassword(int it){ for(int i=0;iusers[i]->username) == 0 && strcmp(login_list[it]->users[i]->password) == 0)return 1; + if(strcmp(login_list[it].username,users[i].username) == 0 && strcmp(login_list[it].password,users[i].password) == 0)return 1; } return 0; } -char *GetAddress(struct sockaddr_in addr) { - char *address_string = (char *)malloc(INET_ADDRSTRLEN + 10); - - if (address_string == NULL) { - return NULL; - } - - char ipStr[INET_ADDRSTRLEN]; - inet_ntop(AF_INET, &(addr.sin_addr), ipStr, sizeof(ipStr)); - - sprintf(address_string, "%s:%d", ipStr, ntohs(addr.sin_port)); - return address_string; -} - char *GetRespond(char *buf,int it) { - char * cmd-malloc(100); + char * cmd=malloc(100); char * data=malloc(100); char * respond=malloc(100); sscanf(buf,"%s %s",cmd,data); if(strcmp(cmd,"USER")==0){ - login_list[it]->login_status=LOGGED_IN; - strcpy(login_list[it]->username,data); - sprintf(respond,"331 %d login ok, send your password\n",data); + login_list[it].login_status=LOGED_IN; + strcpy(login_list[it].username,data); + sprintf(respond,"331 %s login ok, send your password\n",data); } else if(strcmp(cmd,"PASS")==0){ - login_list[it]->login_status=LOGGED_IN; + login_list[it].login_status=LOGED_IN; if(CheckPassword(it)){ sprintf(respond,"230 access granted, restrictions apply\n"); } @@ -105,9 +95,12 @@ char *GetRespond(char *buf,int it) { } int Init() { - memset(login_status,0,sizeof(login_status)); + memset(login_list,0,sizeof(login_list)); memset(users,0,sizeof(users)); - + for (int i = 0;i < MAX_CONNECTION;i++) { + login_list[i].addr = (char*)malloc(50); + strcpy(login_list[i].addr, ""); + } int fd = socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { printf("Failed to create socket\n"); @@ -133,42 +126,46 @@ int Init() { socklen_t len = sizeof(client_addr); int cmd_fd = accept(fd, (struct sockaddr *)&client_addr, &len); - char *client_ip; + char client_ip[INET_ADDRSTRLEN]; int client_port; inet_ntop(AF_INET, &(client_addr.sin_addr), client_ip, sizeof(client_ip)); client_port = ntohs(client_addr.sin_port); printf("Client %s:%d connected.\n", client_ip, client_port); - int it=-1; - for(int i=0;iaddr)){ + int it = -1; + char client_id[50]; + for (int i = 0;i < MAX_CONNECTION;i++) { + GetFullAddress(client_id, client_ip, client_port); + printf("%s\n", client_id); + if (strcmp(client_id, login_list[it].addr) == 0) { it=i; break; } } if (it==-1){ for(int i=0;ilogin_status==0){ - it=i; + if(login_list[i].login_status==0){ + it = i; + strcpy(login_list[i].addr, client_id); break; } } if(it==-1){ - const char limit_exceeded = "530 connection limit exceeded."; + const char limit_exceeded[] = "530 connection limit exceeded."; write(cmd_fd, limit_exceeded, strlen(limit_exceeded)); continue; } } - if(login_list[it]->login_status == UNLOGED_IN){ - const char welcome = "220 welcome."; + if(login_list[it].login_status == UNLOGED_IN){ + const char welcome[] = "220 welcome."; write(cmd_fd, welcome, strlen(welcome)); } char buf[1024]; - int len; - len = read(cmd_fd, buf, sizeof(buf)); + int size; + size = read(cmd_fd, buf, sizeof(buf)); - if (len < 0) { + if (size < 0) { printf("Failed to read or client closed\n"); } @@ -180,9 +177,9 @@ int Init() { void InsertUser(char * username,char * password) { for(int i=0;iusername)==0){ - strcpy(users[i]->username,username); - strcpy(users[i]->password,password); + if(strlen(users[i].username)==0){ + strcpy(users[i].username,username); + strcpy(users[i].password,password); return; } }