#include /* printf */ #include /*exit*/ #include /* memcpy*/ #include void reusePort(int sock); int main( int argc, char *argv[] ) { int s; struct sockaddr_in server; struct sockaddr_in from[3]; int fromlen; int length; fd_set readfds, readfdsCopy; int n,i; int sockList[3], lastSock=0; server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(atoi(argv[1])); s = socket (AF_INET,SOCK_STREAM,0); reusePort(s); if ( bind( s, (struct sockaddr *)&server, sizeof(server) ) ) { close(s); perror("binding name to stream socket"); exit(-1); } listen(s,4); fromlen = sizeof(from); FD_ZERO(&readfdsCopy); FD_SET(s,&readfdsCopy); for(;;){ memcpy(&readfds, &readfdsCopy, sizeof(fd_set)); n = select(FD_SETSIZE, &readfds, (fd_set *) 0, (fd_set *) 0, NULL); if (n > 0) { if (FD_ISSET(s, &readfds)) { printf("Accepting a new connection...\n"); sockList[lastSock] = accept(s, (struct sockaddr *)&(from[lastSock]), &fromlen); FD_SET(sockList[lastSock], &readfdsCopy); lastSock++; } for (i=0; i < lastSock; i++) { if (FD_ISSET(sockList[i], &readfds)) if (distribuyaMensaje(sockList, i, from, lastSock) < 0) { FD_CLR(sockList[i], &readfdsCopy); close (sockList[i]); sockList[i] = sockList[--lastSock]; i--; printf("Number of current clients: %d\n", lastSock); } } } } } int distribuyaMensaje(int *sockList, int i, struct sockaddr_in *from, int lastSock){ char buf[512]; int rc,j; if( (rc=read(sockList[i], buf, sizeof(buf))) < 0) perror("receiving stream message"); if (rc > 0){ buf[rc]='\0'; printf("%s:%d %s\n", inet_ntoa(from[i].sin_addr), ntohs(from[i].sin_port), buf); for (j=0; j