/* Threaded_EchoMonitored.c * Copyright 2016 Agustin Gonzalez */ #include #include #include #include #include #include #include #include int nbytes=0; pthread_mutex_t count_lock = PTHREAD_MUTEX_INITIALIZER; static void * monitor(void *arg) { char buf[10]; int sm, n, cm, len; struct sockaddr_in name; sm = socket(AF_INET, SOCK_STREAM, 0); name.sin_family = AF_INET; name.sin_port = htons(atoi((char *)arg)); name.sin_addr.s_addr = htonl(INADDR_ANY); len = sizeof(struct sockaddr_in); bind(sm, (struct sockaddr *) &name, len); listen(sm, 1); while (1) { cm = accept(sm, (struct sockaddr *) &name, &len); pthread_mutex_lock( &count_lock); sprintf(buf, "%i", nbytes); pthread_mutex_unlock( &count_lock); send(cm, buf, strlen(buf), 0); close(cm); } } int main(int argc, char **argv) { char buf[10]; int se, n, ce, len; struct sockaddr_in name; pthread_t tid; pthread_create(&tid,NULL, monitor,argv[2]); se = socket(AF_INET, SOCK_STREAM, 0); name.sin_family = AF_INET; name.sin_port = htons(atoi(argv[1])); name.sin_addr.s_addr = htonl(INADDR_ANY); len = sizeof(struct sockaddr_in); bind(se, (struct sockaddr *) &name, len); listen(se, 1); ce = accept(se, (struct sockaddr *) &name, &len); while ((n = recv(ce, buf, sizeof(buf), 0)) > 0){ send(ce, buf, n, 0); pthread_mutex_lock( &count_lock); nbytes+=n; pthread_mutex_unlock( &count_lock); } close(ce); close(se); exit (0); }