/* NAME: TCPServer SYNOPSIS: TCPServer [Port_number] DESCRIPTION: The program creates a TCP socket in the inet listen for connections from TCPClients, accept clients into private sockets. It uses select to attend clients' requests as they come. */ #include #include #include #include #include #include #include #include #include #include #include #define MAXHOSTNAME 80 void reusePort(int sock); main( argc, argv ) int argc; char *argv[]; { int s, ss; struct sockaddr_in server; struct sockaddr_in from; int fromlen; int length; fd_set readfds, readfdsCopy; int n,i; int sockList[64], lastSock=0; /* Construct name of socket to send to. */ server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); if (argc == 2) server.sin_port = htons(atoi(argv[1])); else server.sin_port = htons(0); 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); } length = sizeof(server); if ( getsockname (s, (struct sockaddr *)&server,&length) ) { perror("getting socket name"); exit(0); } printf("Server Port is: %d\n", ntohs(server.sin_port)); 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, &fromlen); FD_SET(sockList[lastSock-1], &readfdsCopy); } for (i=0; i < lastSock; i++) { if (FD_ISSET(sockList[i], &readfds)) if (EchoServe(sockList[i]) < 0) { FD_CLR(sockList[i], &readfdsCopy); close (sockList[i]); sockList[i] = sockList[--lastSock]; i--; printf("Number of current clients: %d\n", lastSock); } } } } } int EchoServe(int psd) { char buf[512]; int rc; /* get data from clients and send it back */ for(;;){ printf("\n...server is waiting...\n"); if( (rc=read(psd, buf, sizeof(buf))) < 0) perror("receiving stream message"); if (rc > 0){ buf[rc]='\0'; printf("Received: %s\n", buf); if (send(psd, buf, rc, 0) <0 ) perror("sending stream message"); return(1); } else { printf("Disconnected..\n"); return(-1); } } } void reusePort(int s) { int one=1; if ( setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *) &one,sizeof(one)) == -1 ) { printf("error in setsockopt,SO_REUSEPORT \n"); exit(-1); } }