/* Select_EchoMonitored.c * Copyright 2016 Agustin Gonzalez */ #include #include #include #include #include #include #include int main(int argc, char **argv) { char buf[10]; int es, ms, n, ec, mc, len; struct sockaddr_in name; int nbytes = 0; fd_set readfds, readfdsCopy; es = 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(es, (struct sockaddr *) &name, len); listen(es, 1); ms = socket(AF_INET, SOCK_STREAM, 0); name.sin_family = AF_INET; name.sin_port = htons(atoi(argv[2])); name.sin_addr.s_addr = htonl(INADDR_ANY); len = sizeof(struct sockaddr_in); bind(ms, (struct sockaddr *) &name, len); listen(ms, 1); FD_ZERO(&readfdsCopy); FD_SET(es,&readfdsCopy); FD_SET(ms,&readfdsCopy); while (1) { memcpy(&readfds, &readfdsCopy, sizeof(fd_set)); n = select(FD_SETSIZE, &readfds, (fd_set *) 0, (fd_set *) 0, NULL); if (n>0) { if (FD_ISSET(es, &readfds)) { ec = accept(es, (struct sockaddr *) &name, &len); FD_SET(ec, &readfdsCopy); } if (FD_ISSET(ec, &readfds)) { if ((n = recv(ec, buf, sizeof(buf), 0)) > 0) { send(ec, buf, n, 0); nbytes += n; } else break; } if (FD_ISSET(ms, &readfds)) { mc = accept(ms, (struct sockaddr *) &name, &len); sprintf(buf, "%i", nbytes); send(mc, buf, strlen(buf), 0); close(mc); } } } close(ms); close(ec); close(es); exit (0); }