#include /* for printf() and fprintf() */ #include /* for socket(), bind(), and connect() */ #include /* for sockaddr_in and inet_ntoa() */ #include /* for atoi() and exit() */ #include /* for memset() */ #include /* for close() */ #include #include #include #include #include #include "server.h" #define MAXPENDING 5 /* Maximum outstanding connection requests */ #define MAX_THREADS 2 /*anzahl maximaler Nutzer */ int servSock; /* Socket descriptor fur server */ char join_thread[MAX_THREADS]; //feld aktiver threads pthread_t threads[MAX_THREADS]; //fehlt abgearbetieter threads pthread_mutex_t mx_join; //semeaphore für exkl. zugriff /*fangt das Signal Strg+C ab und beendet alles Verbindugen korrekt*/ void sighandler(int sig) { if(sig == SIGINT) { printf("caught SIGINT!\n"); close(servSock); exit(1); } } int main(int argc, char *argv[]) { int clntSock; /* Socket descriptor for server */ struct sockaddr_in smtpServAddr; /* Local address */ struct sockaddr_in smtpClntAddr; /* Client address */ unsigned short smtpServPort; /* Server port */ fd_set fds; struct timeval tv; int ret, i; unsigned int clntLen; void *value; signal(SIGINT, sighandler); //sighandler initialisierung pthread_mutex_init( &mx_join, NULL ); //semaphore initialisierung memset(join_thread, 0, sizeof(join_thread)); //initialisierung der thread tabelle if (argc != 2) /* test ob anzahl der argumente korrekt ist */ { fprintf(stderr, "Usage: %s \n", argv[0]); return -1; } smtpServPort = atoi(argv[1]); /* erstes argument: server port */ /* Socket fur eingehende Verbindungen starten */ if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { perror("socket"); return -1; } /* Construct local address structure */ memset(&smtpServAddr, 0, sizeof(smtpServAddr)); /* Zero out structure */ smtpServAddr.sin_family = AF_INET; /* Internet address family */ smtpServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ smtpServAddr.sin_port = htons(smtpServPort); /* Local port */ /* Bind an lokale adresse */ if (bind(servSock, (struct sockaddr *) &smtpServAddr, sizeof(smtpServAddr)) < 0) { perror("bind() failed"); return -1; } /* socket wird zyklisch abgehort */ if (listen(servSock, MAXPENDING) < 0) { perror("listen() failed"); return -1; } for (;;) /* endloses warten auf Clienten */ { /* locked */ pthread_mutex_lock( &mx_join ); for(i=0; i