Pthread bugfix, readme, makefile
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					.vscode/
 | 
				
			||||||
							
								
								
									
										26
									
								
								makefile
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								makefile
									
									
									
									
									
								
							@@ -1,25 +1,25 @@
 | 
				
			|||||||
#Client und Server kompilieren
 | 
					#Client und Server kompilieren
 | 
				
			||||||
all: myserver.c myclient.c
 | 
					all: server.c client.c
 | 
				
			||||||
	gcc myserver.c -o myserver
 | 
						gcc server.c -o server -lpthread
 | 
				
			||||||
	gcc myclient.c -o myclient
 | 
						gcc client.c -o client -lpthread
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
#Kompilierten Client und Server löschen	
 | 
					#Kompilierten Client und Server löschen	
 | 
				
			||||||
clean: myclient myserver
 | 
					clean: client server
 | 
				
			||||||
	rm -f myclient myserver
 | 
						rm -f client server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#Nur den Client kompilieren:
 | 
					#Nur den Client kompilieren:
 | 
				
			||||||
client: myclient.c
 | 
					client: client.c
 | 
				
			||||||
	gcc myclient.c -o myclient
 | 
						gcc client.c -o client -lpthread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#Nur den Server kompilieren:
 | 
					#Nur den Server kompilieren:
 | 
				
			||||||
server: myserver.c
 | 
					server: server.c
 | 
				
			||||||
	gcc myserver.c -o myserver
 | 
						gcc server.c -o server -lpthread
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#Kompilierten Server löschen	
 | 
					#Kompilierten Server löschen	
 | 
				
			||||||
cleanS: myserver
 | 
					cleanS: server
 | 
				
			||||||
	rm -f myserver
 | 
						rm -f server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#Kompilierten Client löschen	
 | 
					#Kompilierten Client löschen	
 | 
				
			||||||
cleanC: myclient
 | 
					cleanC: client
 | 
				
			||||||
	rm -f myclient
 | 
						rm -f client
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					# Protokoll 🔧
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
SEND: send;sender;empänger;betreff;nachricht
 | 
					SEND: send;sender;empänger;betreff;nachricht
 | 
				
			||||||
LIST: list:username;postEinAusgang
 | 
					LIST: list:username;postEinAusgang
 | 
				
			||||||
READ: read;username;postEinAusgang;nid
 | 
					READ: read;username;postEinAusgang;nid
 | 
				
			||||||
DEL: del;username;postEinAusgang;nid
 | 
					DEL: del;username;postEinAusgang;nid
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Erstellt von 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Lukas Nowy
 | 
				
			||||||
 | 
					* Georg Reisinger
 | 
				
			||||||
							
								
								
									
										114
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										114
									
								
								server.c
									
									
									
									
									
								
							@@ -13,6 +13,7 @@
 | 
				
			|||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
#include <dirent.h>
 | 
					#include <dirent.h>
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					#include <pthread.h>
 | 
				
			||||||
#define MAXCHAR 1000
 | 
					#define MAXCHAR 1000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define BUF 1024
 | 
					#define BUF 1024
 | 
				
			||||||
@@ -50,50 +51,16 @@ int countFiles(char path[]) {
 | 
				
			|||||||
    return file_count;
 | 
					    return file_count;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *threadFun(void *arg){
 | 
				
			||||||
int main (int argc, char **argv) {
 | 
					   int new_socket = *((int *)arg);
 | 
				
			||||||
  int create_socket, new_socket;
 | 
					   char buffer[BUF];
 | 
				
			||||||
  socklen_t addrlen;
 | 
					   pthread_detach(pthread_self());
 | 
				
			||||||
  char buffer[BUF];
 | 
					   if(new_socket > 0){
 | 
				
			||||||
  int size;
 | 
					      strcpy(buffer, "Welcome to myserver, Please enter your command:\n");
 | 
				
			||||||
  struct sockaddr_in address, cliaddress;
 | 
					      send(new_socket, buffer, strlen(buffer),0);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
  if( argc < 3 ){
 | 
					   do {
 | 
				
			||||||
     printf("Usage: %s S Port Verzeichniss\n", argv[0]);
 | 
					        int size = recv (new_socket, buffer, BUF-1, 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)
 | 
					        if( size > 0)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -345,12 +312,10 @@ int main (int argc, char **argv) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                     ptr_file = fopen(filename,"r");
 | 
					                     ptr_file = fopen(filename,"r");
 | 
				
			||||||
                     if (!ptr_file)
 | 
					                     if (!ptr_file)
 | 
				
			||||||
                        return 1;
 | 
					                        perror("File Open error!");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                     while (fgets(buf,1000, ptr_file)!=NULL) {
 | 
					                     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");
 | 
					               printf("error");
 | 
				
			||||||
               char err[] = "ERR";
 | 
					               char err[] = "ERR";
 | 
				
			||||||
               send(new_socket , err , strlen(err) , 0 );
 | 
					               send(new_socket , err , strlen(err) , 0 );
 | 
				
			||||||
@@ -471,11 +434,58 @@ int main (int argc, char **argv) {
 | 
				
			|||||||
           perror("recv error");
 | 
					           perror("recv error");
 | 
				
			||||||
           char err[] = "ERR";
 | 
					           char err[] = "ERR";
 | 
				
			||||||
           send(new_socket , err , strlen(err) , 0 );
 | 
					           send(new_socket , err , strlen(err) , 0 );
 | 
				
			||||||
           return EXIT_FAILURE;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     } while (strncmp (buffer, "quit", 4)  != 0);
 | 
					     } while (strncmp (buffer, "quit", 4)  != 0);
 | 
				
			||||||
     close (new_socket);
 | 
					     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);
 | 
					  close (create_socket);
 | 
				
			||||||
  return EXIT_SUCCESS;
 | 
					  return EXIT_SUCCESS;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user