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); +} +