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); }
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"); }