#include #include #include #include #include #include /* For atoi() */ #include /* For toupper() */ #include /* For read() */ #include /* for gethostbyaddr() */ int open_listen(int port) { int fd; struct sockaddr_in serverAddr; int optVal; /* Create TCP socket */ fd = socket(AF_INET, SOCK_STREAM, 0); if(fd < 0) { perror("Error creating socket"); exit(1); } /* Allows address (port) to be reused */ optVal = 1; if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(int)) < 0) { perror("Error setting socket option"); exit(1); } /* Create address we're going to listen on (given port number - converted ** to network byte order & any IP address for this machine */ serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Bind address to the socket */ if(bind(fd, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr_in)) < 0){ perror("Error binding socket to port"); exit(1); } /* Listen on socket - means we're ready to accept connections - ** incoming connection requests will be queued */ if(listen(fd, SOMAXCONN) < 0) { perror("Error listening"); exit(1); } return fd; } char* capitalise(char* buffer, int len) { int i; for(i=0; ih_name, ntohs(fromAddr.sin_port)); /* Repeatedly read characters from the connection, convert to ** upper case and send them back */ while((numBytesRead = read(fd, buffer, 1024)) > 0) { capitalise(buffer, numBytesRead); write(fd, buffer, numBytesRead); } /* EOF or error */ if(numBytesRead < 0) { perror("Error reading from socket"); exit(1); } printf("Done\n"); fflush(stdout); close(fd); } } int main(int argc, char* argv[]) { int portnum; int fdServer; if(argc != 2) { fprintf(stderr, "Usage: %s port-num\n", argv[0]); exit(1); } portnum = atoi(argv[1]); if(portnum < 1024 || portnum > 65535) { fprintf(stderr, "Invalid port number: %s\n", argv[1]); exit(1); } fdServer = open_listen(portnum); process_connections(fdServer); return 0; }