diff --git a/server b/server
index a588ded5d9cb376ad0abcfd88481af73387f827b..03ad18df946e49d0f54672f91fc0496800deb840 100755
Binary files a/server and b/server differ
diff --git a/server.c b/server.c
index 7a00d335358684cd3d45e46b5039322ed4235fb9..797d6a2dc4c609399ac6a8392e4cab22e1639f5a 100644
--- a/server.c
+++ b/server.c
@@ -7,10 +7,17 @@
 #include <netdb.h>
 #include <netinet/in.h>
 #include <unistd.h>
+# include <pthread.h>
+
+#define MAXUSER 5
+
+void* handleclient(void * newsockfd);
 
 int main(int argc, char *argv[]){
 	struct addrinfo info, *res, *p;
-	int status;
+	int sockfd, newsockfd;
+	struct sockaddr_storage clien_addr;
+	socklen_t clien_size;
 	char ipstr[INET6_ADDRSTRLEN];
 
 	if (argc <2){
@@ -19,40 +26,94 @@ int main(int argc, char *argv[]){
 	}
 
 	memset(&info, 0, sizeof(info));
-	info.ai_family = AF_UNSPEC; ///sets it to IPv4
+	info.ai_family = AF_UNSPEC; ///sets it to unspecified
 	info.ai_socktype = SOCK_STREAM; //TCP connection stream oriented
-	info.ai_flags = AI_PASSIVE; //use my current IP adress
+	info.ai_flags = AI_PASSIVE; //listen on on all ip interface of machine
+	info.ai_protocol = 0; //set this to zero as default
 
-	if((status =  getaddrinfo(NULL, argv[1], &info, &res) != 0)){
+	if((getaddrinfo(NULL, argv[1], &info, &res) != 0)){
 		fprintf(stderr,"ERROR, no port provided\n");//to check if getaddrinfo gets any addrinfos
 		exit(1);
 	}
 
 	for (p = res; p!= NULL; p = p->ai_next)
 	{
-		void *addr;
-        char *ipver;
+		if((sockfd = socket(p-> ai_family, p->ai_socktype, p->ai_protocol)) < 0){
+			perror("ERROR opening socket");
+			continue;
+		}
+
+		if ((bind(sockfd, p->ai_addr, p->ai_addrlen)) < 0){
+
+			perror("ERROR on binding");
+			continue;
+		}
+
+		break;
+	}
+
+	if (p == NULL)
+	{
+		perror("ERROR on creating and binding");
+		return 2;
+	}
+
+	if(listen(sockfd,MAXUSER)<0){
+		perror("ERROR listening");
+		return 2;
+	}
+
+
+	while(1){
+		clien_size = sizeof (clien_addr);
 
+		if((newsockfd = accept(sockfd, (struct sockaddr *) &clien_addr, &clien_size)) < 0){
+			perror("ERROR accepting");
+			return 3;
+		}
 
-        if (p->ai_family == AF_INET) { // IPv4
-            struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
-            addr = &(ipv4->sin_addr);
-            ipver = "IPv4";
-        } else { // IPv6
-            struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
-            addr = &(ipv6->sin6_addr);
-            ipver = "IPv6";
-        }
+		pthread_t tid;
+
+		if (pthread_create(&tid, NULL, handleclient, &newsockfd) <0)
+		{
+			perror("ERROR creating thread");
+			return 3;
+		}
+
+		pthread_detach(tid);
 
-        inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
-        printf("  %s: %s\n", ipver, ipstr);
 	}
 
 
-	 freeaddrinfo(res);
 
 	 return 0;
 
 
 
-}
\ No newline at end of file
+}
+
+
+void* handleclient(void * newsockfd){
+	int *sockfd_ptr = (int*) newsockfd;
+	int numbytes;
+	int sockfd = *sockfd_ptr;
+	char buffer[256];
+	bzero(buffer, 256);
+
+	if ((numbytes = recv(sockfd, buffer, 255, 0)) <0)
+	{
+		perror("ERROR recieving");
+		return NULL;
+	}
+
+	printf("%s\n", buffer);
+
+	if (send(sockfd, "hello world", 13, 0) <0)
+	{
+		perror("ERROR sending");
+		return NULL;
+	}
+
+	close(sockfd);
+}
+