Esempio n. 1
0
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);
	}	
}