From 356d9e346343949562c890bd3a484be9ba4644e2 Mon Sep 17 00:00:00 2001 From: Lukas Nowy Date: Mon, 26 Oct 2020 12:55:39 +0100 Subject: [PATCH] 1. Teil komplett --- client.c | 255 ++++++++++++++++++++++++++++ readme.txt | 4 + server.c | 482 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 741 insertions(+) create mode 100644 client.c create mode 100644 readme.txt create mode 100644 server.c diff --git a/client.c b/client.c new file mode 100644 index 0000000..2946ced --- /dev/null +++ b/client.c @@ -0,0 +1,255 @@ +/* myclient.c */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define BUF 1024 + +void remN(char *s) { + char *p2 = s; + while(*s != '\0') { + if(*s != '\t' && *s != '\n') { + *p2++ = *s++; + } else { + ++s; + } + } + *p2 = '\0'; +} + +bool startsWith(const char *pre, const char *str) +{ + size_t lenpre = strlen(pre), + lenstr = strlen(str); + return lenstr < lenpre ? false : memcmp(pre, str, lenpre) == 0; +} + +int main (int argc, char **argv) { + + int create_socket; + char buffer[BUF]; + struct sockaddr_in address; + int size; + + if( argc < 3 ){ + printf("Usage: %s ServerAdresse Port\n", argv[0]); + exit(EXIT_FAILURE); + } + + if ((create_socket = socket (AF_INET, SOCK_STREAM, 0)) == -1) + { + perror("Socket error"); + return EXIT_FAILURE; + } + + memset(&address,0,sizeof(address)); + address.sin_family = AF_INET; + address.sin_port = htons (atoi(argv[2])); + inet_aton (argv[1], &address.sin_addr); + + if (connect ( create_socket, (struct sockaddr *) &address, sizeof (address)) == 0) + { + printf ("Connection with server (%s) established\n", inet_ntoa (address.sin_addr)); + size=recv(create_socket,buffer,BUF-1, 0); + if (size>0) + { + buffer[size]= '\0'; + printf("%s",buffer); + } + } + else + { + perror("Connect error - no server available"); + return EXIT_FAILURE; + } + + + do { + //command vom user überprüfen + char command[6] = ""; + printf ("\nEnter Command: \n"); + fgets (command, 6, stdin); + + //je nach command wird was audgeführt + if(startsWith("send", command) == true) { + + char sender[8] = ""; + char empfaenger[8] = ""; + char betreff[80] = ""; + char nachricht[128] = ""; + char bufferString[BUF] = ""; + strcpy(bufferString, ""); + strcat(bufferString, "send"); + + //User Dateneingabe und daten einlesen + printf("\n"); + fgets (sender, 8, stdin); + + printf("\n"); + fgets (empfaenger, 8, stdin); + + printf("\n"); + fgets (betreff, 80, stdin); + + printf("\n"); + fgets (nachricht, 80, stdin); + + //Buffer formatieren + strcat(bufferString, ";"); + strcat(bufferString, sender); + strcat(bufferString, ";"); + strcat(bufferString, empfaenger); + strcat(bufferString, ";"); + strcat(bufferString, betreff); + strcat(bufferString, ";"); + strcat(bufferString, nachricht); + remN(bufferString); + //printf("Buffer: %s", bufferString); + send(create_socket, bufferString, strlen (bufferString), 0); + + //Response vom Server (OK oder ERR) empfangen und ausgeben + char readBuffer[BUF] = ""; + int valread = read(create_socket , readBuffer, 1024); + printf("\n%s\n", readBuffer); + + } + + else if(startsWith("list", command) == true) { + char bufferString[BUF] = "list"; + char username[8] = ""; + char p[20] = ""; + int counter = 0; + + printf("\n"); + fgets (username, 8, stdin); + printf("\n"); + fgets (p, 20, stdin); + + strcat(bufferString, ";"); + strcat(bufferString, username); + strcat(bufferString, ";"); + strcat(bufferString, p); + remN(bufferString); + printf("%s ", bufferString); + send(create_socket, bufferString, strlen (bufferString), 0); + + char readBuffer[BUF] = ""; + int valread = read(create_socket , readBuffer, 1024); + + char delimiter[] = ";"; + char *ptr; + ptr = strtok(readBuffer, delimiter); + + while(ptr != NULL) { + + + if(strcmp(ptr, ".") == 0) { + + } + + else if(strcmp(ptr, "..") == 0) { + + } + + else if (counter == 0) { + printf("\n", ptr); + } + + else { + printf("Betreff: %s \n", ptr); + //printf("%.*s", 17, ptr + 5); + } + + counter = counter + 1; + + // naechsten Abschnitt erstellen + ptr = strtok(NULL, delimiter); + } + + } + + else if(startsWith("read", command) == true) { + char bufferString[BUF] = "read"; + char username[8] = ""; + char nid[80] = ""; + char folder[20] = ""; + + printf("\n"); + fgets (username, 8, stdin); + printf("\n"); + fgets (folder, 20, stdin); + printf("\n"); + fgets (nid, 80, stdin); + + strcat(bufferString, ";"); + strcat(bufferString, username); + strcat(bufferString, ";"); + strcat(bufferString, folder); + strcat(bufferString, ";"); + strcat(bufferString, nid); + remN(bufferString); + + //printf("%s ", bufferString); + + send(create_socket, bufferString, strlen (bufferString), 0); + + //strcpy(buffer, ""); + //buffer[size]= '\0'; + char readBuffer[BUF] = ""; + int valread = read(create_socket , readBuffer, 1000); + printf("\n%s\n", readBuffer ); + + } + + else if(startsWith("del", command) == true) { + //printf("\n del"); + + char username[8] = ""; + char nachrichtennummer[80] = ""; + char bufferString[BUF] = "del"; + char p[20] = ""; + + printf("\n"); + fgets (username, 8, stdin); + printf("\n"); + fgets (p, 20, stdin); + printf("\n"); + fgets (nachrichtennummer, 80, stdin); + + strcat(bufferString, ";"); + strcat(bufferString, username); + strcat(bufferString, ";"); + strcat(bufferString, p); + strcat(bufferString, ";"); + strcat(bufferString, nachrichtennummer); + remN(bufferString); + //printf("%s ", bufferString); + send(create_socket, bufferString, strlen (bufferString), 0); + + char readBuffer[BUF] = ""; + int valread = read(create_socket , readBuffer, 1024); + printf("\n%s\n", readBuffer ); + + } + + else if(startsWith("quit", command) == true) { + strcpy(buffer, "quit\n"); + } + + else { + printf("DAS IST KEIN COMMAND!!!!!"); + } + + + + + } + while (strcmp (buffer, "quit\n") != 0); + close (create_socket); + return EXIT_SUCCESS; +} diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..327a2cc --- /dev/null +++ b/readme.txt @@ -0,0 +1,4 @@ +SEND: send;sender;empänger;betreff;nachricht +LIST: list:username;postEinAusgang +READ: read;username;postEinAusgang;nid +DEL: del;username;postEinAusgang;nid \ No newline at end of file diff --git a/server.c b/server.c new file mode 100644 index 0000000..95d7542 --- /dev/null +++ b/server.c @@ -0,0 +1,482 @@ +/* myserver.c */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* Linux/UNIX */ +#include /* Linux/UNIX */ +#include +#include +#include +#define MAXCHAR 1000 + +#define BUF 1024 + +bool startsWith(const char *pre, const char *str) +{ + size_t lenpre = strlen(pre), + lenstr = strlen(str); + return lenstr < lenpre ? false : memcmp(pre, str, lenpre) == 0; +} + +void mstore_data(const char *filepath, const char *data) +{ + FILE *fp = fopen(filepath, "ab"); + if (fp != NULL) + { + fputs(data, fp); + fclose(fp); + } +} + +int countFiles(char path[]) { + int file_count = 0; + DIR * dirp; + struct dirent * entry; + + dirp = opendir(path); /* There should be error handling after this */ + while ((entry = readdir(dirp)) != NULL) { + if (entry->d_type == DT_REG) { /* If the entry is a regular file */ + file_count++; + } + } + closedir(dirp); + + return file_count; +} + + +int main (int argc, char **argv) { + int create_socket, new_socket; + socklen_t addrlen; + char buffer[BUF]; + int size; + struct sockaddr_in address, cliaddress; + + if( argc < 3 ){ + printf("Usage: %s S Port Verzeichniss\n", argv[0]); + exit(EXIT_FAILURE); + } + + create_socket = socket (AF_INET, SOCK_STREAM, 0); + + memset(&address,0,sizeof(address)); + address.sin_family = AF_INET; + address.sin_addr.s_addr = INADDR_ANY; + address.sin_port = htons (atoi(argv[1])); + + if (bind ( create_socket, (struct sockaddr *) &address, sizeof (address)) != 0) { + perror("bind error"); + return EXIT_FAILURE; + } + listen (create_socket, 5); + + addrlen = sizeof (struct sockaddr_in); + + //Verzeichniss erstellen + + mkdir(argv[2], 0711); + + while (1) { + printf("Waiting for connections...\n"); + new_socket = accept ( create_socket, (struct sockaddr *) &cliaddress, &addrlen ); + if (new_socket > 0) + { + printf ("Client connected from %s:%d...\n", inet_ntoa (cliaddress.sin_addr),ntohs(cliaddress.sin_port)); + strcpy(buffer,"Welcome to myserver, Please enter your command:\n"); + send(new_socket, buffer, strlen(buffer),0); + } + //ab hier + do { + size = recv (new_socket, buffer, BUF-1, 0); + if( size > 0) + { + + buffer[size] = '\0'; + + //Überprüfen welchen command der client eingegeben hat, + // wenn command nicht zutreffend error zurücksenden + if(startsWith("send", buffer) == true) { + + char delimiter[] = ";"; + char *ptr; + //den buffer mit dem seperator splitten + ptr = strtok(buffer, delimiter); + + int counter = 0; + char filename1[] = ""; + char filename2[] = ""; + char sender[8] = ""; + char content[] = ""; + char empfaenger[8] = ""; + char betreff[80] = ""; + char nid[100] = ""; + + //timestamp als ersten teil der id erstellen + char ts[20]; + time_t now = time(NULL); + strftime(ts, 20, "%Y-%m-%d%H:%M:%S", localtime(&now)); + + + //den gesplitteten buffer schritt für schritt durchgehen + while(ptr != NULL) { + //printf("Abschnitt gefunden: %s\n", ptr); + //sender auslesen, ordner für sender erstellen, wenn nicht vorhanden + if (counter == 1) { + struct stat st = {0}; + char dir[] = "./data/postausgang/"; + strcat(dir, ptr); + + if (stat(dir, &st) == -1) { + mkdir(dir, 0700); + } + + strcat(sender, ptr); + printf("1 %s \n", ptr); + } + + //empfänger auslesen, ordner für empfänger erstellen, wenn nicht vorhanden + if (counter == 2) { + struct stat st2 = {0}; + char dir2[] = "./data/posteingang/"; + strcat(dir2, ptr); + + if (stat(dir2, &st2) == -1) { + mkdir(dir2, 0700); + } + + strcat(empfaenger, ptr); + printf("2 %s \n" , ptr); + } + + //betreff auslesen, id (ts) fertigstellen, + //2 dateien erstellen für sender und empfänger mit ts als filename + if (counter == 3) { + //printf("3 %s \n", ptr); + + strcat(betreff, ptr); + strcat(ts, betreff); + + //Pfad erstellen für den sender und file erstellen + char fb[100] = "touch ./data/postausgang/"; + strcat(fb, "/"); + strcat(fb, sender); + strcat(fb, "/"); + strcat(fb, ts); + printf("PATH: %s \n", fb); + system(fb); + + //Pfad erstellen für den empfänger und file erstellen + strcpy(fb, "touch ./data/posteingang/"); + strcat(fb, "/"); + strcat(fb, empfaenger); + strcat(fb, "/"); + strcat(fb, ts); + printf("PATH: %s \n", fb); + system(fb); + + } + + //buffer in files schreiben + if (counter == 4) { + //printf("4 %s \n", ptr); + + //file content für den empfänger erstellen + char fp[100] = "./data/posteingang/"; + char content1[1000] = ""; + strcpy(content1, "ID: "); + strcat(content1, ts); + strcat(content1, "\n"); + strcat(content1, "Received from: "); + strcat(content1, sender); + strcat(content1, "\n"); + strcat(content1, "Betreff: "); + strcat(content1, betreff); + strcat(content1, "\n"); + strcat(content1, "Message: "); + strcat(content1, ptr); + + strcat(fp, empfaenger); + strcat(fp, "/"); + strcat(fp, ts); + //content in das file storen + mstore_data(fp, content1); + + //file content für den sender erstellen + char content2[1000] = ""; + strcpy(content2, "ID: "); + strcat(content2, ts); + strcat(content2, "\n"); + strcat(content2, "Sent to: "); + strcat(content2, empfaenger); + strcat(content2, "\n"); + strcat(content2, "Betreff: "); + strcat(content2, betreff); + strcat(content2, "\n"); + strcat(content2, "Message: "); + strcat(content2, ptr); + + strcpy(fp, "./data/postausgang/"); + strcat(fp, sender); + strcat(fp, "/"); + strcat(fp, ts); + //content2 in das file storen + mstore_data(fp, content2); + + } + counter = counter + 1; + // naechsten Abschnitt erstellen + ptr = strtok(NULL, delimiter); + + } + + //printf ("\n Message received: \n %s", buffer); + //OK an den client zurücksenden + char suc[] = "OK"; + send(new_socket , suc , strlen(suc) , 0 ); + + } + + else if(startsWith("del", buffer) == true) { + printf("delete: %s ", buffer); + + char delimiter[] = ";"; + char *ptr; + ptr = strtok(buffer, delimiter); + + int counter = 0; + + char username[8] = ""; + char nid[80] = ""; + char p[20] = ""; + char path[100] = ""; + + while(ptr != NULL) { + + //username speichern + if(counter == 1) { + strcat(username, ptr); + } + + //post ein- oder ausgang speichern + if(counter == 2) { + strcpy(p, ptr); + } + + //nid speichern, den path string erstellen, rm -rf path ausführen + if(counter == 3) { + strcat(nid, ptr); + if(strcmp(p, "postausgang") == 0) { + strcpy(path, "rm -rf ./data/postausgang/"); + } + + if(strcmp(p, "posteingang") == 0) { + strcpy(path, "rm -rf ./data/posteingang/"); + } + + strcat(path, username); + strcat(path, "/"); + strcat(path, nid); + + system(path); + } + counter = counter + 1; + + // naechsten Abschnitt erstellen + ptr = strtok(NULL, delimiter); + } + + //OK an client zurücksenden + char resBuff[BUF] = "OK\n"; + send(new_socket, resBuff, strlen(resBuff),0); + strcpy(buffer, ""); + + } + + //read + else if(startsWith("read", buffer) == true) { + + char delimiter[] = ";"; + char *ptr; + ptr = strtok(buffer, delimiter); + + int counter = 0; + char username[8] = ""; + char nid[80] = ""; + char betreff[80] = ""; + char folder[20] = ""; + + while(ptr != NULL) { + + if(counter == 1) { + //username speichern + strcat(username, ptr); + } + + //postein- oder ausgang speichern + if(counter == 2) { + strcpy(folder, ptr); + } + + //nid speichern, file mit dem path lesen und an client zzrücksenden + if(counter == 3) { + //nid + strcat(nid, ptr); + strcpy(betreff, nid); + + + char filename[] = "./data/"; + strcat(filename, folder); + strcat(filename, "/"); + + strcat(filename, username); + strcat(filename, "/"); + strcat(filename, nid); + printf("PATH: %s", filename); + + FILE *ptr_file; + char buf[1000]; + char res[1000]; + + ptr_file = fopen(filename,"r"); + if (!ptr_file) + return 1; + + while (fgets(buf,1000, ptr_file)!=NULL) { + + strcat(res, buf); + + } + + + fclose(ptr_file); + + + // and send that buffer to client + + printf("%s", res); + send(new_socket , res, strlen(res), 0 ); + + } + + counter = counter + 1; + + // naechsten Abschnitt erstellen + ptr = strtok(NULL, delimiter); + } + } + + //list + else if(startsWith("list", buffer) == true) { + + char delimiter[] = ";"; + char *ptr; + ptr = strtok(buffer, delimiter); + + int counter = 0; + char username[8] = ""; + char p[20] = ""; + char path[100] = ""; + + while(ptr != NULL) { + + //username speichern + if(counter == 1) { + strcat(username, ptr); + } + + //postein - oder ausgang speichern + if(counter == 2) { + strcat(p, ptr); + + if(strcmp(p, "postausgang") == 0) { + strcpy(path, "./data/postausgang/"); + } + + if(strcmp(p, "posteingang") == 0) { + strcpy(path, "./data/posteingang/"); + } + + strcat(path, username); + strcat(path, "/"); + + DIR *d; + struct dirent *dir; + char filenames[1000] = ""; + + //Messages zählen + int fc = countFiles(path); + char str[1000]; + //int in string konverten + sprintf(str, "%d", fc); + + strcat(filenames, str); + strcat(filenames, ";"); + + //file lesen + d = opendir(path); + + if (d) + { + + while ((dir = readdir(d)) != NULL) + { + strcat(filenames, dir->d_name); + strcat(filenames, ";"); + } + + closedir(d); + + //an client senden + send(new_socket , filenames , strlen(filenames) , 0 ); + strcpy(buffer, ""); + + } + + } + + + counter = counter + 1; + + // naechsten Abschnitt erstellen + ptr = strtok(NULL, delimiter); + } + + + } + + else { + printf("error"); + char err[] = "ERR"; + send(new_socket , err , strlen(err) , 0 ); + + } + + //printf ("\n content: \n %s", buffer); + + + } + else if (size == 0) + { + printf("Client closed remote socket\n"); + break; + } + else + { + perror("recv error"); + char err[] = "ERR"; + send(new_socket , err , strlen(err) , 0 ); + return EXIT_FAILURE; + } + + } while (strncmp (buffer, "quit", 4) != 0); + close (new_socket); + } + close (create_socket); + return EXIT_SUCCESS; +}