Esempio n. 1
0
int udp_server(char *listenportno)
{
	int listenfd = 0;
	struct sockaddr_in serv_addr;
	int portno = atoi(listenportno);

	char readBuff[1024], writeBuff[1024];
	time_t ticks;

	listenfd = socket(AF_INET, SOCK_STREAM, 0);
	if(listenfd == -1){
		perror("Unable to create socket");
	    exit(0);
	}

	memset(&serv_addr, 0, sizeof(serv_addr));
    memset(readBuff, 0, sizeof(readBuff)); 
    memset(writeBuff, 0, sizeof(writeBuff));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(portno);

    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

    int n;
    n = read(listenfd, readBuff, sizeof(readBuff));

    while(n > 0)
    {
    	size_t size = strlen(readBuff) + 1;
    	char *request = malloc(size);
    	strcpy(request, readBuff);
    	printf("%s", request);
    	printf("$ ");
    	fflush(stdout);
    	int type_of_request = parse_request(request);
    	memset(response, 0, sizeof(response));
    	if(type_of_request == -1){
    		error = 1;
    		strcpy(response, "Error: No request of this type.\n");
    	}
    	else if(type_of_request == 1){
    		IndexGet_handler(request);
    	}
    	else if(type_of_request == 2){
    		FileHash_handler(request);
    	}
    	else if(type_of_request == 3){
    		FileDownload_handler(request);
    	}
    	if(error == 1){
            memset(writeBuff, 0, strlen(writeBuff));
    		strcpy(writeBuff, response);
    		strcat(writeBuff,"~@~");
            write(listenfd , writeBuff , strlen(writeBuff));
            error = -1;
    		memset(response, 0, sizeof(response)); 
            memset(writeBuff, 0, strlen(writeBuff));
            memset(readBuff, 0, sizeof(readBuff)); 
            while((n = read(listenfd, readBuff, sizeof(readBuff)))<=0);
            continue;
    	}
    	else if(type_of_request == 1){
    		int a;
    		memset(response, 0, sizeof(response));
            memset(writeBuff, 0, strlen(writeBuff));
    		for(a = 0 ; a < i ; a++)
            {
                sprintf(response, "%-35s| %-10d| %-3c| %-20s" , pdata[a].filename , pdata[a].size , pdata[a].type , ctime(&pdata[a].mtime));
                strcat(writeBuff,response);
            }
            strcat(writeBuff,"~@~");
    		write(listenfd, writeBuff, strlen(writeBuff));
    	}
    	else if(type_of_request == 2){
    		int a;
            for (a = 0 ; a < i ; a++)
            {
            	memset(response, 0, sizeof(response));
            	memset(writeBuff, 0, strlen(writeBuff));
                sprintf(response, "%-35s |   ", hdata[a].filename);

                strcat(writeBuff,response);
                int c;
    			memset(response, 0, sizeof(response));

                for (c = 0 ; c < MD5_DIGEST_LENGTH ; c++)
                {
                    sprintf(response, "%x",hdata[a].hash[c]);
                    strcat(writeBuff,response);
                }
                sprintf(response, "\t %20s",ctime(&hdata[a].mtime));
                strcat(writeBuff,response);
            	write(listenfd , writeBuff , strlen(writeBuff));
            }
            memset(writeBuff, 0, strlen(writeBuff));
            strcpy(writeBuff,"~@~");
            write(listenfd, writeBuff , strlen(writeBuff));
    	}
    	else if(type_of_request == 3)
        {
            FILE* fp;
            fp = fopen(fileDownloadName,"rb");
            size_t bytes_read;
			memset(response, 0, sizeof(response));
            while(!feof(fp))
            {
                bytes_read = fread(response, 1, 1024, fp);
                memcpy(writeBuff,response,bytes_read);
                write(listenfd, writeBuff , bytes_read);
                memset(writeBuff, 0, sizeof(writeBuff));
                memset(response, 0, sizeof(response));
            }
            memcpy(writeBuff,"~@~",3);
            write(listenfd, writeBuff , 3);
            memset(writeBuff, 0, sizeof(writeBuff));
            fclose(fp);
        }
    	else if(type_of_request == 4){
    		char ch = 'y';
        	memset(writeBuff, 0, sizeof(writeBuff));
    		if(ch == 'n'){
        		strcpy(writeBuff, "FileUpload Deny");
    		}
    		else {
				strcpy(writeBuff, "FileUpload Accept");
				write(listenfd, writeBuff, strlen(writeBuff));

				char *request_data = strtok(request, " \n");
				request_data = strtok(NULL, " \n");
				int f = open(request_data, O_WRONLY | O_CREAT | O_EXCL, (mode_t)0600);
				if(f == -1){
					perror("Error opening file for writing\n");
					return 1;
				}   
				close(f);
				FILE *fp = fopen(request_data, "wb");
				
				n = read(listenfd, readBuff, sizeof(readBuff)-1);
		        while(1)
		        {
		            readBuff[n] = 0;
		            if(readBuff[n-1] == '~' && readBuff[n-3] == '~' && readBuff[n-2] == '@')
		            {
		                readBuff[n-3] = 0;
		                fwrite(readBuff,1,n-3,fp);
		                fclose(fp);
		                memset(readBuff, 0,n-3);
		                break;
		            }
		            else
		            {
		                fwrite(readBuff,1,n,fp);
		                memset(readBuff, 0,n);
		            }
		            n = read(listenfd, readBuff, sizeof(readBuff)-1);
		            if(n < 0)
		                break;
		        }
    		}
    	}

        memset(writeBuff, 0, sizeof(writeBuff));
    	memset(readBuff, 0, sizeof(readBuff));
 		while((n = read(listenfd, readBuff, sizeof(readBuff)))<=0);
    }
    close(listenfd);
    wait(NULL);
}
Esempio n. 2
0
void server_query_handler (int sock, int connection, struct sockaddr_in server_addr, struct sockaddr_in client_addr) {
    char *argument_list[1000];
    parse_to_array(server_receive_buffer, argument_list);
    int len;

    for (len = 0; argument_list[len]; len++)
        ;

    if (strcmp(argument_list[0], "PING") == 0) {
        PING_handler(argument_list, len, sock, connection, client_addr);

        if (strcmp(connection_type, "tcp") == 0) {
            send(connection, server_send_buffer, 1024, 0);
        } else {
            if (strcmp(connection_type, "udp") == 0) {
                sendto(sock, server_send_buffer, 1024, 0, (struct sockaddr *)&client_addr, sizeof(struct sockaddr));
            }
        }
        strcpy(server_send_buffer, "MAGIC-STRING-SPRINKLEBERRY-MUFFIN");
        if (strcmp(connection_type, "tcp") == 0) {
            send(connection, server_send_buffer, 1024, 0);
        } else {
            if (strcmp(connection_type, "udp") == 0) {
                sendto(sock, server_send_buffer, 1024, 0, (struct sockaddr *)&client_addr, sizeof(struct sockaddr));
            }
        }

        return;
    }

    if (strcmp(argument_list[0], "IndexGet") == 0) {
        if (len < 2) {
            logger_error_server("TOO FEW ARGUMENTS TO INDEXGET");
            strcpy(server_send_buffer, "TOO FEW ARGUMENTS TO INDEXGET.\nUSAGE: IndexGet <flag> [<arg1> <arg2>]");
        }
        else if ( (strcmp(argument_list[1], "--shortlist") == 0 && len != 4) || (strcmp(argument_list[1], "--regex") == 0 && len != 3) || (strcmp(argument_list[1], "--longlist") == 0 && len != 2) ) {
            logger_error_server("INVALID FORMAT. PLEASE CHECK SYNTAX OF INDEXGET");
            strcpy(server_send_buffer, "INVALID FORMAT. PLEASE CHECK SYNTAX OF INDEXGET\nUSAGE: IndexGet <flag> [<arg1> <arg2>]");
        }
        else
            IndexGet_handler(argument_list, len, sock, connection, client_addr);

        strcat(server_send_buffer, "MAGIC-STRING-SPRINKLEBERRY-MUFFIN");

        if (strcmp(connection_type, "tcp") == 0) {
            send(connection, server_send_buffer, 1024, 0);
        } else {
            if (strcmp(connection_type, "udp") == 0) {
                sendto(sock, server_send_buffer, 1024, 0, (struct sockaddr *)&client_addr, sizeof(struct sockaddr));
            }
        }

        return;
    }

    if (strcmp(argument_list[0], "FileHash") == 0) {
        FileHash_handler(argument_list, len, sock, connection, client_addr);

        strcat(server_send_buffer, "MAGIC-STRING-SPRINKLEBERRY-MUFFIN");

        if (strcmp(connection_type, "tcp") == 0) {
            send(connection, server_send_buffer, 1024, 0);
        } else {
            if (strcmp(connection_type, "udp") == 0) {
                sendto(sock, server_send_buffer, 1024, 0, (struct sockaddr *)&client_addr, sizeof(struct sockaddr));
            }
        }

        return;
    }

    if (strcmp(argument_list[0], "FileUpload") == 0) {
        FileUpload_handler(argument_list, len, sock, connection, client_addr);

        strcat(server_send_buffer, "MAGIC-STRING-SPRINKLEBERRY-MUFFIN");

        if (strcmp(connection_type, "tcp") == 0) {
            send(connection, server_send_buffer, 1024, 0);
        } else {
            if (strcmp(connection_type, "udp") == 0) {
                sendto(sock, server_send_buffer, 1024, 0, (struct sockaddr *)&client_addr, sizeof(struct sockaddr));
            }
        }

        return;
    }

    if (strcmp(argument_list[0], "FileDownload") == 0) {
        FileDownload_handler(argument_list, len, sock, connection, client_addr);

        strcat(server_send_buffer, "MAGIC-STRING-SPRINKLEBERRY-MUFFIN");

        if (strcmp(connection_type, "tcp") == 0) {
            send(connection, server_send_buffer, 1024, 0);
        } else {
            if (strcmp(connection_type, "udp") == 0) {
                sendto(sock, server_send_buffer, 1024, 0, (struct sockaddr *)&client_addr, sizeof(struct sockaddr));
            }
        }

        return;
    }

    else
        strcpy(server_send_buffer, "INVALID COMMAND.\nList of Allowed Commands is:\n1) IndexGet\n2) FileHash\n3) FileDownload\n4) FileUpload\n5) exit");

    strcat(server_send_buffer, "MAGIC-STRING-SPRINKLEBERRY-MUFFIN");

    if (strcmp(connection_type, "tcp") == 0) {
        send(connection, server_send_buffer, 1024, 0);
    } else {
        if (strcmp(connection_type, "udp") == 0) {
            sendto(sock, server_send_buffer, 1024, 0, (struct sockaddr *)&client_addr, sizeof(struct sockaddr));
        }
    }

    logger_error_server("UNKNOWN COMMAND");
    logger_warn_server("IGNORING UNKNOWN COMMAND");
}