int tcp_server(int list_port) { int listenfd = 0; listenfd = socket(AF_INET, SOCK_STREAM, 0); if(listenfd == -1) { perror("Unable to create socket"); exit(0); } char read_buffer[1024], write_buffer[1024]; struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); memset(read_buffer, 0, sizeof(read_buffer)); memset(write_buffer, 0, sizeof(write_buffer)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(list_port); int fileupload_flag = 0; if(bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) { perror("Unable to bind"); exit(0); } listen(listenfd, 10); int connfd = 0; connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); int data; error = -1; data = read(connfd,read_buffer,sizeof(read_buffer)); while( data > 0) { char *request = malloc(strlen(read_buffer)+1); strcpy(request,read_buffer); strcpy(history[hist_count],read_buffer); hist_count++; int type_request = get_type(request); printf("\nRequest Received : %s",request); response[0] = '\0'; write_buffer[0] = '\0'; printf("Enter Request Here :"); fflush(stdout); if(type_request == -1) //Error { error = 1; sprintf(response,"Invalid request\n"); } else if(type_request == 1) //Indexget { IndexGet_handler(request); //memset(wri, 0, sizeof(response)); } /*else if(type_request == 2) //FileHash FileHash_handler(request); else if(type_request == 3) //FileDownload FileDownload_handler(request); */ if(error == 1) { strcat(write_buffer,response); strcat(write_buffer,"~^~"); write(connfd , write_buffer , strlen(write_buffer)); error = -1; memset(write_buffer, 0, sizeof(write_buffer)); memset(read_buffer, 0, sizeof(read_buffer)); while((data = read(connfd,read_buffer,sizeof(read_buffer)))<=0); continue; } if(type_request == 1) { memset(response, 0, sizeof(response)); memset(write_buffer,0, sizeof(write_buffer)); //strcat(write_buffer,response); int a; //printf("I am i : %d\n",i); for(a = 0 ; a < iter ; a++) { sprintf(response, "%s| %d| %s| %s" , pdata[a].filename , (int)pdata[a].size , pdata[a].type , ctime(&pdata[a].mtime)); strcat(write_buffer,response); } strcat(write_buffer,"~^~"); write(connfd , write_buffer , strlen(write_buffer)); } /*else if(type_request == 2) { memset(write_buffer, 0, sizeof(write_buffer)); strcat(write_buffer,response); int b,c; for (b = 0 ; b < i ; b++) { sprintf(response, "%s | ",hdata[b].filename); strcat(write_buffer,response); for (c = 0 ; c < MD5_DIGEST_LENGTH ; c++) { sprintf(response, "%x",hdata[b].hash[c]); strcat(write_buffer,response); } sprintf(response, "\t %s",ctime(&hdata[b].mtime)); strcat(write_buffer,response); } strcat(write_buffer,"$^*"); write(connfd , write_buffer , strlen(write_buffer)); } else if(type_request == 3) { FILE* fp; fp = fopen(fileDownloadName,"rb"); size_t bytes_read; while(!feof(fp)) { bytes_read = fread(response, 1, 1024, fp); memcpy(write_buffer,response,bytes_read); write(connfd , write_buffer , bytes_read); memset(write_buffer, 0, sizeof(write_buffer)); memset(response, 0, sizeof(response)); } memcpy(write_buffer,"$^*",3); write(connfd , write_buffer , 3); memset(write_buffer, 0, sizeof(write_buffer)); fclose(fp); } else if(type_request == 4) { printf("\nWould like to accept upload file : press 1 for yes else press 0\n"); memset(write_buffer, 0,sizeof(write_buffer)); fgets(write_buffer,sizeof(write_buffer),stdin); //scanf("%d",&fileupload_flag); fileupload_flag = 1; if(fileupload_flag == 1) { memcpy(writeBuff,"FileUpload Accept\n",18); write(connfd , writeBuff , 18); memset(writeBuff,0,18); } else { memcpy(writeBuff,"FileUpload Deny\n",16); write(connfd , writeBuff , 16); memset(writeBuff,0,16); } } if(fileupload_flag == 1) { char copyrequest[1024]; memset(copyrequest, 0,1024); memcpy(copyrequest,request,1024); char *size = strtok(copyrequest,"\n"); size = strtok(NULL,"\n"); long fsize = atol(size); char *request_data = NULL; const char delim[] = " \n"; request_data = strtok(request,delim); request_data = strtok(NULL,delim); int f; int result; f = open(request_data, O_WRONLY | O_CREAT | O_EXCL, (mode_t)0600); if (f == -1) { perror("Error opening file for writing:"); return 1; } result = lseek(f,fsize-1, SEEK_SET); result = write(f, "", 1); if (result < 0) { close(f); perror("Error opening file for writing:"); return 1; } close(f); FILE *fp; fp = fopen(request_data,"wb"); n = read(connfd, 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(connfd, readBuff, sizeof(readBuff)-1); if(n < 0) break; } } */ //memset(writeBuff, 0,1024); regex = 0; //fileupload_flag = 0; memset(read_buffer, 0, sizeof(read_buffer)); memset(write_buffer, 0, sizeof(write_buffer)); while((data = read(connfd,read_buffer,sizeof(read_buffer)))<=0); } close(connfd); wait(NULL); }
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"); }