diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1d74e21 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.vscode/ diff --git a/client b/client new file mode 100644 index 0000000..449ced8 Binary files /dev/null and b/client differ diff --git a/makefile b/makefile index d162efd..e91d609 100755 --- a/makefile +++ b/makefile @@ -1,25 +1,25 @@ #Client und Server kompilieren -all: myserver.c myclient.c - gcc myserver.c -o myserver - gcc myclient.c -o myclient +all: server.c client.c + gcc server.c -o server -lpthread + gcc client.c -o client -lpthread #Kompilierten Client und Server löschen -clean: myclient myserver - rm -f myclient myserver +clean: client server + rm -f client server #Nur den Client kompilieren: -client: myclient.c - gcc myclient.c -o myclient +client: client.c + gcc client.c -o client -lpthread #Nur den Server kompilieren: -server: myserver.c - gcc myserver.c -o myserver +server: server.c + gcc server.c -o server -lpthread #Kompilierten Server löschen -cleanS: myserver - rm -f myserver +cleanS: server + rm -f server #Kompilierten Client löschen -cleanC: myclient - rm -f myclient +cleanC: client + rm -f client diff --git a/readme.txt b/readme.md similarity index 51% rename from readme.txt rename to readme.md index 327a2cc..8ad382e 100644 --- a/readme.txt +++ b/readme.md @@ -1,4 +1,14 @@ + +# Protokoll 🔧 + +``` 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 +DEL: del;username;postEinAusgang;nid +``` + +# Erstellt von + +* Lukas Nowy +* Georg Reisinger diff --git a/server b/server new file mode 100644 index 0000000..84062b8 Binary files /dev/null and b/server differ diff --git a/server.c b/server.c index 95d7542..be99fcb 100644 --- a/server.c +++ b/server.c @@ -13,6 +13,7 @@ #include #include #include +#include #define MAXCHAR 1000 #define BUF 1024 @@ -50,50 +51,16 @@ int countFiles(char path[]) { 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); +void *threadFun(void *arg){ + int new_socket = *((int *)arg); + char buffer[BUF]; + pthread_detach(pthread_self()); + if(new_socket > 0){ + strcpy(buffer, "Welcome to myserver, Please enter your command:\n"); + send(new_socket, buffer, strlen(buffer),0); + } + do { + int size = recv (new_socket, buffer, BUF-1, 0); if( size > 0) { @@ -345,12 +312,10 @@ int main (int argc, char **argv) { ptr_file = fopen(filename,"r"); if (!ptr_file) - return 1; + perror("File Open error!"); while (fgets(buf,1000, ptr_file)!=NULL) { - - strcat(res, buf); - + strcat(res, buf); } @@ -448,9 +413,7 @@ int main (int argc, char **argv) { } - } - - else { + }else { printf("error"); char err[] = "ERR"; send(new_socket , err , strlen(err) , 0 ); @@ -471,11 +434,58 @@ int main (int argc, char **argv) { 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); + pthread_exit(NULL); +} + + +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); + pthread_t tid; + int i = 0; + 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)); + } + if (pthread_create(&tid, NULL, threadFun, &new_socket) != 0) + { + perror("Failed to create thread"); + exit(EXIT_FAILURE); + } } close (create_socket); return EXIT_SUCCESS;