#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BUFFERSIZE 512 #define MAX_THREADS 15 int threads, srvsock; pthread_mutex_t threadlock; void* ThreadRoutine(void* _param); int main(int argc, char* argv[]) { struct sockaddr_in srv; if (argc < 2) { printf("usage: tcpsrv6 \n"); exit(1); } printf ("Multi-Threaded echo server started.\n"); if ((srvsock = socket (AF_INET, SOCK_STREAM, 0)) == -1) { perror ("creating socket"); exit (1); } memset (&srv, 0, sizeof (struct sockaddr_in)); srv.sin_family = AF_INET; srv.sin_port = htons(atoi(argv[1])); srv.sin_addr.s_addr = htonl(INADDR_ANY); if (bind (srvsock, (struct sockaddr *)&srv, sizeof(srv)) != 0) { perror ("bind addr"); exit (1); } printf("Listening...\n"); listen(srvsock, 10); while (1) { while (threads < MAX_THREADS) { pthread_t thread; if (pthread_create(&thread, NULL, ThreadRoutine, (void*)NULL) == -1) { perror("pthread_create"); exit(1); } if (pthread_mutex_lock(&threadlock) != 0) { perror("mutex lock error"); exit(1); } threads++; /* increase threads accepting */ if (pthread_mutex_unlock(&threadlock) != 0) { perror("mutex unlock error"); exit(1); } } sleep(1); } close (srvsock); return 0; } void* ThreadRoutine(void* _param) { char buffer[BUFFERSIZE]; /* buffer met lengte van BUFFERSIZE */ int i, bytes = 1; struct sockaddr_in cli; size_t cli_size = sizeof(cli); /* Grootte van cli om later naar het adres te refereren */ printf("New accept thread\n"); while (1) { if ((i = accept(srvsock, (struct sockaddr *)&cli, &cli_size)) > 0) { printf("Connected to %s (socket: %i)\n", inet_ntoa(cli.sin_addr), i); if (pthread_mutex_lock(&threadlock) != 0) { perror("mutex lock error"); exit(1); } threads--; if (pthread_mutex_unlock(&threadlock) != 0) { perror("mutex unlock error"); exit(1); } do { bytes = recv(i, buffer, BUFFERSIZE, 0); if (send(i, buffer, BUFFERSIZE, 0) == -1) bytes = 0; printf("Received %i bytes from %s\n", bytes, inet_ntoa(cli.sin_addr)); } while(bytes > 0); close(i); printf("Closing thread (socket: %i, ip: %s).\n", i, inet_ntoa(cli.sin_addr)); pthread_exit(NULL); } else { printf("Accept error\n"); } } }