void* communicate(void* ctrl_sock) { int control_sock = *((int*)ctrl_sock); struct sockaddr_in data_listen_addr, client_data_addr; int sockaddrinlen = sizeof(data_listen_addr); memset(&data_listen_addr, 0, sizeof(struct sockaddr_in)); memset(&client_data_addr, 0, sizeof(struct sockaddr_in)); int data_listen_sock = 0, data_sock = 0; char recvbuffer[1024]; memset(recvbuffer, 0, sizeof(recvbuffer)); char sendbuffer[1024]; memset(sendbuffer, 0, sizeof(sendbuffer)); char* databuffer = (char*)malloc(sizeof(char) * DATABUFFERSIZE); memset(databuffer, 0, sizeof(char) * DATABUFFERSIZE); char working_dir[1024] = "/home/mengcz/ftpserver/"; sprintf(sendbuffer, "220 Hello\r\n"); write(control_sock, sendbuffer, strlen(sendbuffer)); char username[1024] = {0}; char passwd[1024] = {0}; recv_code(control_sock, recvbuffer, sizeof(recvbuffer)); sscanf(recvbuffer, "USER %s\r\n", username); sprintf(sendbuffer, "331 Please specify the password.\r\n"); write(control_sock, sendbuffer, strlen(sendbuffer)); recv_code(control_sock, recvbuffer, sizeof(recvbuffer)); sscanf(recvbuffer, "PASS %s\r\n", passwd); if (1) { sprintf(sendbuffer, "230 Login successful.\r\n"); write(control_sock, sendbuffer, strlen(sendbuffer)); while (1) { recv_code(control_sock, recvbuffer, sizeof(recvbuffer)); if (strcmp(recvbuffer, "PASV\r\n") == 0) { data_listen_sock = socket(AF_INET, SOCK_STREAM, 0); int templen = sizeof(data_listen_addr); data_listen_addr.sin_family = AF_INET; data_listen_addr.sin_addr.s_addr = INADDR_ANY; bind(data_listen_sock, (struct sockaddr*)&data_listen_addr, sizeof(data_listen_addr)); listen(data_listen_sock, 5); getsockname(data_listen_sock, (struct sockaddr*)&data_listen_addr, (socklen_t*)&templen); int portnum = ntohs(data_listen_addr.sin_port); sprintf(sendbuffer, "227 Entering Passive Mode (0,0,0,0,%d,%d).\r\n", (portnum >> 8), (portnum & ((1 << 8) - 1))); write(control_sock, sendbuffer, strlen(sendbuffer)); data_sock = accept(data_listen_sock, (struct sockaddr*)&client_data_addr, (socklen_t*)&sockaddrinlen); } else if (recvbuffer == strstr(recvbuffer, "POST ")) {
void read_games_list(int fd){ char code; gameID game_id = 0; send_code(fd, LIST_GAMES_CODE); while((code = recv_code(fd)) == SUCCESS_RESPONSE_CODE){ game_id = recv_game_id(fd); fprintf(stdout, "%d \n", game_id); } if(code != END_OF_LIST_CODE) fprintf(stdout, "Error during reading the list. \n"); }
void start_new_game(int fd){ char code; gameID game_id; send_code(fd,NEW_GAME_CODE); code = recv_code(fd); switch(code){ case SUCCESS_RESPONSE_CODE: game_id = recv_game_id(fd); fprintf(stdout, "New game's id: %d\n", game_id); break; default: fprintf(stdout, "Error occured (errcode: %d)\n",code); } }